diff --git a/CHANGELOG.md b/CHANGELOG.md index 35a7136d..712c9f04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,42 @@ See full changelog for the OpenAPI schema (OAS) [here](https://github.com/plaid/plaid-openapi/blob/master/CHANGELOG.md). +# 31.0.0 +- Updating to OAS 2020-09-14_1.617.1 + +## Breaking changes in this version +- [Breaking] Removed the deprecated longest_gap_between_transactions, average_inflow_amount, and average_outflow_amount fields from the BaseReportAccountInsights object in the /cra/check_report/base_report/get response. + +## OpenAPI Schema Changes +### 2020-09-14_1.617.1 +- For Plaid Check: `date_of_birth` is now required within the `consumer_report_user_identity` object when creating or updating a user token. + +### 2020-09-14_1.617.0 +- [Breaking] Removed the deprecated longest_gap_between_transactions, average_inflow_amount, and average_outflow_amount fields from the BaseReportAccountInsights object in the /cra/check_report/base_report/get response. + +### 2020-09-14_1.616.0 +- Add `originating_fund_source` to `/wallet/transaction/execute` endpoint. + +### 2020-09-14_1.615.0 +- Add `account_details_401k` objects to `/investments/auth/get` endpoint. + +### 2020-09-14_1.614.1 +- Update `owners` field description for empty case + +### 2020-09-14_1.614.0 +- Add model for the new `retirement_401k` numbers object to the `InvestmentsAuthGetNumbers` schema. + +### 2020-09-14_1.613.0 +- Add `POST /signal/schedule` endpoint + +### 2025-01-27_1.611.0 +- Add `end_to_end_id` to `/payment_initiation/payment/get` + +### 2020-09-14_1.611.0 +- Add RfP to /transfer/capabilities/get + +### 2020-09-14_1.610.2 +- Update `cashflow_updates` docs to reflect proper cadence + # 30.1.0 - Updating to OAS 2020-09-14_1.610.1 - Updated minimum Axios version to 1.7.4. @@ -64,7 +101,7 @@ endpoints. ### 2020-09-14_1.600.2 - Update descriptions for `/network/status/get` request and response fields - Add `nullable: true` to mortgage `account_number` field in the `MortgageLiability` schema to reflect actual behavior. -- Add `transactions_refresh` to `Products` array to reflect actual behavior; this field is not accepted as input to `/link/token/create` but can be part of supported products array in the `Institution` object. +- Add `transactions_refresh` to `Products` array to reflect actual behavior; this field is not accepted as input to `/link/token/create` but can be part of supported products array in the `Institution` object. ### 2020-09-14_1.600.1 - `depository`+`cash management` Accounts are now eligible for Auth data for certain institutions @@ -356,7 +393,7 @@ endpoints. - add `/issues/get`, `/issues/search`, and `/issues/subscribe` for Support API endpoints. ### 2020-09-14_1.563.0 -- Update fields on `item` object in `/item/get` response +- Update fields on `item` object in `/item/get` response - Add `consented_use_cases` field - Add `consented_data_scopes` field - Add `created_at` field @@ -539,14 +576,14 @@ endpoints. ### 2020-09-14_1.535.2 - Make some `CraBankIncomeSummary` fields visible. -- +- ### 2020-09-14_1.535.1 ### 2020-09-14_1.535.0 - [Breaking for Go] Updated `consumer_report_user_identity` field in `/user/update` to be required to reflect actual API behavior. ### 2020-09-14_1.534.7 -- Add `stated_account_number_enabled` to `investments_auth` in `LinkTokenCreateRequest` +- Add `stated_account_number_enabled` to `investments_auth` in `LinkTokenCreateRequest` ### 2020-09-14_1.534.6 - [Breaking] Updated base report endpoints and objects to include `cra` prefix @@ -1107,7 +1144,7 @@ endpoints. - Internal changes only ### 2020-09-14_1.483.0 -- Added net new fields to StatementsAccount object: `account_mask`, `account_subtype`, `account_official_name` +- Added net new fields to StatementsAccount object: `account_mask`, `account_subtype`, `account_official_name` # 18.2.0 - Updating to OAS 2020-09-14_1.482.3 diff --git a/api.ts b/api.ts index b36909d2..4c772e4f 100644 --- a/api.ts +++ b/api.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -281,7 +281,7 @@ export interface AccountBase { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountBase */ @@ -445,7 +445,7 @@ export interface AccountIdentity { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountIdentity */ @@ -555,7 +555,7 @@ export interface AccountIdentityDocumentUpload { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountIdentityDocumentUpload */ @@ -677,7 +677,7 @@ export interface AccountIdentityMatchScore { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountIdentityMatchScore */ @@ -2944,7 +2944,7 @@ export enum AssetReportType { */ export interface AssetReportUser { /** - * An identifier you determine and submit for the user. + * An identifier you determine and submit for the user. If using the Credit Dashboard, Customers should pass in the `user_token` created in `/user/create`. * @type {string} * @memberof AssetReportUser */ @@ -5067,7 +5067,7 @@ export interface BaseReportAccount { */ transactions: Array; /** - * Data returned by the financial institution about the account owner or owners. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. + * Data returned by the financial institution about the account owner or owners. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. This array can also be empty if no owners are found. * @type {Array} * @memberof BaseReportAccount */ @@ -5189,14 +5189,7 @@ export interface BaseReportAccountInsights { */ average_days_between_transactions?: number; /** - * Deprecated; use `longest_gaps_between_transactions` instead. Longest gap between sequential transactions - * @type {Array} - * @memberof BaseReportAccountInsights - * @deprecated - */ - longest_gap_between_transactions?: Array; - /** - * Customers must transition from `longest_gap_between_transactions` by January 31st 2025. Longest gap between sequential transactions in a time period. This array can include multiple time periods. + * Longest gap between sequential transactions in a time period. This array can include multiple time periods. * @type {Array} * @memberof BaseReportAccountInsights */ @@ -5208,14 +5201,7 @@ export interface BaseReportAccountInsights { */ number_of_inflows?: Array; /** - * Deprecated; use `average_inflow_amounts` instead. Average amount of debit transactions into the account. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. - * @type {Array} - * @memberof BaseReportAccountInsights - * @deprecated - */ - average_inflow_amount?: Array; - /** - * Customers must transition from `average_inflow_amount` by January 31st 2025. Average amount of debit transactions into the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Average amount of debit transactions into the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @type {Array} * @memberof BaseReportAccountInsights */ @@ -5227,14 +5213,7 @@ export interface BaseReportAccountInsights { */ number_of_outflows?: Array; /** - * Deprecated; use `average_outflow_amounts` instead. Average amount of transactions out of the account. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. - * @type {Array} - * @memberof BaseReportAccountInsights - * @deprecated - */ - average_outflow_amount?: Array; - /** - * Customers must transition from `average_outflow_amount` by January 31st 2025. Average amount of transactions out of the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Average amount of transactions out of the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @type {Array} * @memberof BaseReportAccountInsights */ @@ -8961,7 +8940,7 @@ export interface ConsumerReportUserIdentity { */ ssn_last_4?: string | null; /** - * To be provided in the format \"yyyy-mm-dd\". This field is required for any clients who became Plaid Check customers on or after Oct 1, 2024. This field will be required for all Plaid Check customers as of Feb 1, 2025. + * To be provided in the format \"yyyy-mm-dd\". This field is required for all Plaid Check customers. * @type {string} * @memberof ConsumerReportUserIdentity */ @@ -9934,6 +9913,75 @@ export interface CraCheckReportCashflowInsightsGetOptions { */ attributes_version?: CashflowAttributesVersion | null; } +/** + * CraCheckReportCashflowInsightsGetRequest defines the request schema for `/cra/check_report/cashflow_insights/get`. + * @export + * @interface CraCheckReportCashflowInsightsGetRequest + */ +export interface CraCheckReportCashflowInsightsGetRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + secret?: string; + /** + * The user token associated with the User data is being requested for. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + user_token?: string; + /** + * The third-party user token associated with the requested User data. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + third_party_user_token?: string; + /** + * + * @type {CraCheckReportCashflowInsightsGetOptions} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + options?: CraCheckReportCashflowInsightsGetOptions | null; +} +/** + * CraCheckReportCashflowInsightsGetResponse defines the response schema for `/cra/check_report/cashflow_insights/get`. + * @export + * @interface CraCheckReportCashflowInsightsGetResponse + */ +export interface CraCheckReportCashflowInsightsGetResponse { + /** + * + * @type {CraCashflowInsightsReport} + * @memberof CraCheckReportCashflowInsightsGetResponse + */ + report: CraCashflowInsightsReport; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetResponse + */ + request_id: string; +} +/** + * Defines configuration options to generate a Base Report + * @export + * @interface CraCheckReportCreateBaseReportOptions + */ +export interface CraCheckReportCreateBaseReportOptions { + /** + * Client-generated identifier, which can be used by lenders to track loan applications. + * @type {string} + * @memberof CraCheckReportCreateBaseReportOptions + */ + client_report_id?: string | null; +} /** * CraCheckReportCreateRequest defines the request schema for `/cra/check_report/create`. * @export @@ -9976,6 +10024,30 @@ export interface CraCheckReportCreateRequest { * @memberof CraCheckReportCreateRequest */ days_required?: number; + /** + * Specifies a list of products that will be eagerly generated when creating the report. These products will be made available before a success webhook is sent. Use this option to minimize response latency for product `/get` endpoints. + * @type {Array} + * @memberof CraCheckReportCreateRequest + */ + products?: Array | null; + /** + * + * @type {CraCheckReportCreateBaseReportOptions} + * @memberof CraCheckReportCreateRequest + */ + base_report?: CraCheckReportCreateBaseReportOptions | null; + /** + * + * @type {CraCheckReportCashflowInsightsGetOptions} + * @memberof CraCheckReportCreateRequest + */ + cashflow_insights?: CraCheckReportCashflowInsightsGetOptions | null; + /** + * + * @type {CraCheckReportPartnerInsightsGetOptions} + * @memberof CraCheckReportCreateRequest + */ + partner_insights?: CraCheckReportPartnerInsightsGetOptions | null; /** * * @type {ConsumerReportPermissiblePurpose} @@ -22255,7 +22327,7 @@ export interface InstitutionStatusAlertWebhook { environment: WebhookEnvironmentValues; } /** - * Contains the RTP network and types supported by the linked Item\'s institution. + * Contains the RTP and RfP network and types supported by the linked Item\'s institution. * @export * @interface InstitutionSupportedNetworks */ @@ -22266,6 +22338,12 @@ export interface InstitutionSupportedNetworks { * @memberof InstitutionSupportedNetworks */ rtp: TransferCapabilitiesGetRTP; + /** + * + * @type {TransferCapabilitiesGetRfP} + * @memberof InstitutionSupportedNetworks + */ + rfp: TransferCapabilitiesGetRfP; } /** * InstitutionsGetByIdRequest defines the request schema for `/institutions/get_by_id` @@ -22860,6 +22938,99 @@ export enum InvestmentTransactionType { Transfer = 'transfer' } +/** + * Object containing information on contribution transactions for the 401k account. + * @export + * @interface InvestmentsAuth401kContributionDetails + */ +export interface InvestmentsAuth401kContributionDetails { + /** + * A list of the most recent contribution transactions for the 401k account. Includes all contributions made on the same day. + * @type {Array} + * @memberof InvestmentsAuth401kContributionDetails + */ + last_contribution_transactions: Array; + /** + * Number of contribution transactions on this account, for the past month. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_count_1m: number; + /** + * Sum of the contribution transactions on this account, for the past month. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_amount_1m: number; + /** + * Number of contribution transactions on this account, for the past 6 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_count_6m: number; + /** + * Sum of the contribution transactions on this account, for the past 6 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_amount_6m: number; + /** + * Number of contribution transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_count_12m: number; + /** + * Sum of the contribution transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_amount_12m: number; +} +/** + * Object containing information on account fee transactions for the 401k account. + * @export + * @interface InvestmentsAuth401kFeeDetails + */ +export interface InvestmentsAuth401kFeeDetails { + /** + * Number of account fee transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kFeeDetails + */ + account_fee_count_12m: number; + /** + * Sum of account fee transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kFeeDetails + */ + account_fee_amount_12m: number; +} +/** + * Additional account fee and contribution information for 401k type accounts. + * @export + * @interface InvestmentsAuthAccountDetails401k + */ +export interface InvestmentsAuthAccountDetails401k { + /** + * The ID of the 401k account. + * @type {string} + * @memberof InvestmentsAuthAccountDetails401k + */ + account_id?: string; + /** + * + * @type {InvestmentsAuth401kFeeDetails} + * @memberof InvestmentsAuthAccountDetails401k + */ + fee_details?: InvestmentsAuth401kFeeDetails; + /** + * + * @type {InvestmentsAuth401kContributionDetails} + * @memberof InvestmentsAuthAccountDetails401k + */ + contribution_details?: InvestmentsAuth401kContributionDetails; +} /** * Object with metadata pertaining to the source of data for the account numbers, owners, and holdings that are returned. * @export @@ -22903,6 +23074,12 @@ export interface InvestmentsAuthGetNumbers { * @memberof InvestmentsAuthGetNumbers */ aton?: Array; + /** + * + * @type {Array} + * @memberof InvestmentsAuthGetNumbers + */ + retirement_401k?: Array; } /** * InvestmentsAuthGetRequest defines the request schema for `/investments/auth/get` @@ -22990,6 +23167,12 @@ export interface InvestmentsAuthGetResponse { * @memberof InvestmentsAuthGetResponse */ data_sources: InvestmentsAuthDataSources; + /** + * Additional information for accounts of 401k subtype. + * @type {Array} + * @memberof InvestmentsAuthGetResponse + */ + account_details_401k?: Array; /** * * @type {Item} @@ -26639,6 +26822,19 @@ export interface LinkTokenAccountFilters { */ other?: OtherFilter; } +/** + * Configuration parameters for the Cashflow Report product. Currently in closed beta. + * @export + * @interface LinkTokenCashflowReport + */ +export interface LinkTokenCashflowReport { + /** + * Number of days of transaction history to request in the Cashflow Report product. + * @type {number} + * @memberof LinkTokenCashflowReport + */ + days_requested?: number; +} /** * A map containing data to pass in for the Card Switch flow. * @export @@ -27704,7 +27900,7 @@ export interface LinkTokenCreateResponse { */ link_token: string; /** - * The expiration date for the `link_token`, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format. By default, a `link_token` created to generate a `public_token` that will be exchanged for a new `access_token` expires after 4 hours, and a `link_token` created for an existing Item (such as when updating an existing `access_token` by launching Link in update mode) expires after 30 minutes. If using [Hosted Link](https://plaid.com/docs/link/hosted-link/), the `link_token` will expire at the same time as the Hosted Link URL, and you can customize the duration using the `hosted_link.url_lifetime_seconds` option in the request. If using Link Delivery (beta), the `link_token` will expire by default after 24 hours if sent via SMS and after 7 days if sent via email. + * The expiration date and time for the `link_token`, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format. By default, a `link_token` created to generate a `public_token` that will be exchanged for a new `access_token` expires after 4 hours, and a `link_token` created for an existing Item (such as when updating an existing `access_token` by launching Link in update mode) expires after 30 minutes. If using [Hosted Link](https://plaid.com/docs/link/hosted-link/), the `link_token` will expire at the same time as the Hosted Link URL, and you can customize the duration using the `hosted_link.url_lifetime_seconds` option in the request. If using Link Delivery (beta), the `link_token` will expire by default after 24 hours if sent via SMS and after 7 days if sent via email. If using Identity Verification, Link token expiration will not be enforced; an Identity Verification Link session can be created with an expired Link token. * @type {string} * @memberof LinkTokenCreateResponse */ @@ -28488,7 +28684,7 @@ export enum MonitoringInsightsStatus { } /** - * For each user enabled for Cash Flow Updates, this webhook will fire every 14 days with information on the status of the update. Upon receiving the webhook, call `/cra/monitoring_insights/get` to retrieve the updated insights. + * For each user enabled for Cash Flow Updates, this webhook will fire every day with information on the status of the update. Upon receiving the webhook, call `/cra/monitoring_insights/get` to retrieve the updated insights. * @export * @interface MonitoringInsightsWebhook */ @@ -29459,6 +29655,31 @@ export interface NumbersInternationalNullable { */ bic: string; } +/** + * Identifying information for transferring holdings from a 401k account to another 401k account or IRA via the manual 401k rollover process. + * @export + * @interface NumbersRetirement401k + */ +export interface NumbersRetirement401k { + /** + * The Plaid account ID associated with the account numbers + * @type {string} + * @memberof NumbersRetirement401k + */ + account_id: string; + /** + * The plan number for the employer\'s 401k retirement plan + * @type {string} + * @memberof NumbersRetirement401k + */ + plan?: string; + /** + * The full account number for the account + * @type {string} + * @memberof NumbersRetirement401k + */ + account?: string; +} /** * The type of transfer. Valid values are `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. This field is omitted for Plaid Ledger Sweep events. * @export @@ -29500,6 +29721,37 @@ export interface OptionContract { */ underlying_security_ticker: string; } +/** + * The original source of the funds. This field is required by local regulation for certain businesses (e.g. money remittance) to send payouts to recipients in the EU and UK. + * @export + * @interface OriginatingFundSource + */ +export interface OriginatingFundSource { + /** + * The full name associated with the source of the funds. + * @type {string} + * @memberof OriginatingFundSource + */ + full_name: string; + /** + * + * @type {PaymentInitiationAddress} + * @memberof OriginatingFundSource + */ + address: PaymentInitiationAddress | null; + /** + * The account number from which the funds are sourced. + * @type {string} + * @memberof OriginatingFundSource + */ + account_number: string; + /** + * The Business Identifier Code, also known as SWIFT code, for this bank account. + * @type {string} + * @memberof OriginatingFundSource + */ + bic: string; +} /** * Originator and their status. * @export @@ -31920,6 +32172,12 @@ export interface PaymentInitiationPayment { * @memberof PaymentInitiationPayment */ transaction_id?: string | null; + /** + * A unique identifier assigned by Plaid to each payment for tracking and reconcilliation purposes. Note: Not all banks handle end_to_end_id consistently. To ensure accurate matching, clients should convert both the incoming end_to_end_id and the one provided by Plaid to the same case (either lower or upper) before comparison. For virtual account payments, Plaid manages this field automatically. + * @type {string} + * @memberof PaymentInitiationPayment + */ + end_to_end_id?: string | null; } /** * PaymentInitiationPaymentCreateRequest defines the request schema for `/payment_initiation/payment/create` @@ -32143,6 +32401,12 @@ export interface PaymentInitiationPaymentGetResponse { * @memberof PaymentInitiationPaymentGetResponse */ transaction_id?: string | null; + /** + * A unique identifier assigned by Plaid to each payment for tracking and reconcilliation purposes. Note: Not all banks handle end_to_end_id consistently. To ensure accurate matching, clients should convert both the incoming end_to_end_id and the one provided by Plaid to the same case (either lower or upper) before comparison. For virtual account payments, Plaid manages this field automatically. + * @type {string} + * @memberof PaymentInitiationPaymentGetResponse + */ + end_to_end_id?: string | null; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -35767,7 +36031,8 @@ export enum ProcessorTokenCreateRequestProcessorEnum { Esusu = 'esusu', Ansa = 'ansa', Scribeup = 'scribeup', - Straddle = 'straddle' + Straddle = 'straddle', + Loanpro = 'loanpro' } /** @@ -36743,6 +37008,17 @@ export interface RecipientBACSNullable { */ sort_code?: string; } +/** + * The recommendation result for that date. + * @export + * @enum {string} + */ +export enum RecommendationString { + Recommended = 'RECOMMENDED', + NotRecommended = 'NOT_RECOMMENDED', + Unknown = 'UNKNOWN' +} + /** * Insights relating to expenses and deposits that are predicted to occur on a scheduled basis, such as biweekly, monthly, or annually. Common examples include loan payments, bill payments, subscriptions, and payroll income. This is a beta field, available to all users. * @export @@ -41204,6 +41480,124 @@ export interface SignalReturnReportResponse { */ request_id: string; } +/** + * The payment method specified in the `default_payment_method` field directly impacts the timing recommendations provided by the API for submitting the debit entry to your processor or ODFI. If unspecified, Signal defaults to `STANDARD_ACH`. `SAME_DAY_ACH`: Same Day ACH (as defined by Nacha). The Signal API assumes the settlement will occur on the same business day if the `/signal/schedule` request is submitted by 6:00 PM UTC. Note: The actual cutoff time can vary depending on your payment processor or ODFI. NACHA has established three processing windows for Same Day ACH (UTC): 2:30 PM, 6:45 PM, and 8:45 PM. `STANDARD_ACH`: Standard ACH (as defined by Nacha), typically settled one to three business days after submission. `REAL_TIME_PAYMENTS`: Real-time payments via Request for Payment through networks such as RTP (The Clearing House) and FedNow, where the consumer can authorize the payment in response to a RFP, and the transaction is processed and settled immediately. `DEBIT_CARD`: Payments processed over debit card networks, leveraging the card-based infrastructure for real-time or near-real-time settlement. `MULTIPLE_PAYMENT_METHODS`: Indicates that there is no default debit rail or multiple payment methods are available, and the transaction could use any of them based on customer policy or availability. + * @export + * @enum {string} + */ +export enum SignalScheduleDefaultPaymentMethod { + SameDayAch = 'SAME_DAY_ACH', + StandardAch = 'STANDARD_ACH', + RealTimePayments = 'REAL_TIME_PAYMENTS', + DebitCard = 'DEBIT_CARD', + MultiplePaymentMethods = 'MULTIPLE_PAYMENT_METHODS' +} + +/** + * Conveys information on if a retry is recommended on a given date + * @export + * @interface SignalScheduleRecommendation + */ +export interface SignalScheduleRecommendation { + /** + * The specific date for submitting the debit entry, formatted in ISO 8601 (e.g., \"2025-01-17\"). + * @type {string} + * @memberof SignalScheduleRecommendation + */ + date?: string; + /** + * + * @type {RecommendationString} + * @memberof SignalScheduleRecommendation + */ + recommendation?: RecommendationString; + /** + * The rank of the recommendation based on the likelihood of debit success, with 1 representing the most optimal date. Dates with `NOT_RECOMMENDED` or `UNKNOWN` will have rank `null`. + * @type {number} + * @memberof SignalScheduleRecommendation + */ + rank?: number | null; +} +/** + * SignalScheduleRequest defines the request schema for `/signal/schedule` + * @export + * @interface SignalScheduleRequest + */ +export interface SignalScheduleRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof SignalScheduleRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof SignalScheduleRequest + */ + secret?: string; + /** + * The access token associated with the Item data is being requested for. + * @type {string} + * @memberof SignalScheduleRequest + */ + access_token: string; + /** + * The Plaid `account_id` of the account that is the funding source for the proposed transaction. The `account_id` is returned in the `/accounts/get` endpoint as well as the [`onSuccess`](/docs/link/ios/#link-ios-onsuccess-linkSuccess-metadata-accounts-id) callback metadata. This will return an [`INVALID_ACCOUNT_ID`](/docs/errors/invalid-input/#invalid_account_id) error if the account has been removed at the bank or if the `account_id` is no longer valid. + * @type {string} + * @memberof SignalScheduleRequest + */ + account_id: string; + /** + * The unique ID that you would like to use to refer to this transaction. For your convenience mapping your internal data, you could use your internal ID/identifier for this transaction. The max length for this field is 36 characters. + * @type {string} + * @memberof SignalScheduleRequest + */ + client_transaction_id: string; + /** + * The transaction amount, in USD (e.g. `102.05`) + * @type {number} + * @memberof SignalScheduleRequest + */ + amount: number; + /** + * + * @type {SignalScheduleDefaultPaymentMethod} + * @memberof SignalScheduleRequest + */ + default_payment_method?: SignalScheduleDefaultPaymentMethod; +} +/** + * SignalScheduleResponse defines the response schema for `/signal/schedule` + * @export + * @interface SignalScheduleResponse + */ +export interface SignalScheduleResponse { + /** + * The recommended optimal date to submit the debit entry, formatted in ISO 8601 \"YYYY-MM-DD\" (e.g., \"2024-03-30\"). The `optimal_date` is derived from the date with rank = 1 in the following recommendations array. NOTE: The `default_payment_method` field specified in the request will affect the recommendation, since we\'re accounting for debit settlement time. The debit scheduling evaluation starts from the day the /signal/schedule request is submitted (Day 0) or the next banking day if the submission day is not a banking day, and extends through the following five banking days (Day 1 to Day 5). If no date within this period is considered likely to result in a successful debit attempt, `null` will be returned for the `optimal_date`. + * @type {string} + * @memberof SignalScheduleResponse + */ + optimal_date: string | null; + /** + * This array provides a date-by-date evaluation of debit submission recommendations within the five banking day evaluation period. Each object in the array represents a retry recommendation for a specific date. + * @type {Array} + * @memberof SignalScheduleResponse + */ + recommendations: Array; + /** + * If bank information was not available to be used in the Signal model, this array contains warnings describing why bank data is missing. If you want to receive an API error instead of Signal scores in the case of missing bank data, file a support ticket or contact your Plaid account manager. + * @type {Array} + * @memberof SignalScheduleResponse + */ + warnings: Array; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof SignalScheduleResponse + */ + request_id: string; +} /** * Risk scoring details broken down by risk category. * @export @@ -45247,6 +45641,19 @@ export interface TransferCapabilitiesGetResponse { */ request_id: string; } +/** + * Contains the supported service types in RfP + * @export + * @interface TransferCapabilitiesGetRfP + */ +export interface TransferCapabilitiesGetRfP { + /** + * When `true`, the linked Item\'s institution supports RfP debit transfer. + * @type {boolean} + * @memberof TransferCapabilitiesGetRfP + */ + debit?: boolean; +} /** * Defines the request schema for `/transfer/configuration/get` * @export @@ -48448,7 +48855,7 @@ export interface TransferRefundFailure { */ failure_code?: string | null; /** - * The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). + * The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). This field is deprecated in favor of the more versatile `failure_code`, which encompasses non-ACH failure codes as well. * @type {string} * @memberof TransferRefundFailure * @deprecated @@ -51135,6 +51542,12 @@ export interface WalletTransactionExecuteRequest { * @memberof WalletTransactionExecuteRequest */ reference: string; + /** + * + * @type {OriginatingFundSource} + * @memberof WalletTransactionExecuteRequest + */ + originating_fund_source?: OriginatingFundSource | null; } /** * WalletTransactionExecuteResponse defines the response schema for `/wallet/transaction/execute` @@ -55453,6 +55866,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet: async (craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options: any = {}): Promise => { + // verify required parameter 'craCheckReportCashflowInsightsGetRequest' is not null or undefined + assertParamExists('craCheckReportCashflowInsightsGet', 'craCheckReportCashflowInsightsGetRequest', craCheckReportCashflowInsightsGetRequest) + const localVarPath = `/cra/check_report/cashflow_insights/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(craCheckReportCashflowInsightsGetRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -62830,6 +63288,51 @@ export const PlaidApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule: async (signalScheduleRequest: SignalScheduleRequest, options: any = {}): Promise => { + // verify required parameter 'signalScheduleRequest' is not null or undefined + assertParamExists('signalSchedule', 'signalScheduleRequest', signalScheduleRequest) + const localVarPath = `/signal/schedule`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication clientId required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration) + + // authentication plaidVersion required + await setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration) + + // authentication secret required + await setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration) + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(signalScheduleRequest, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -67217,6 +67720,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -69021,6 +69535,17 @@ export const PlaidApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.signalReturnReport(signalReturnReportRequest, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async signalSchedule(signalScheduleRequest: SignalScheduleRequest, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.signalSchedule(signalScheduleRequest, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -70408,6 +70933,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): AxiosPromise { return localVarFp.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any): AxiosPromise { + return localVarFp.craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options).then((request) => request(axios, basePath)); + }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -72048,6 +72583,16 @@ export const PlaidApiFactory = function (configuration?: Configuration, basePath signalReturnReport(signalReturnReportRequest: SignalReturnReportRequest, options?: any): AxiosPromise { return localVarFp.signalReturnReport(signalReturnReportRequest, options).then((request) => request(axios, basePath)); }, + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule(signalScheduleRequest: SignalScheduleRequest, options?: any): AxiosPromise { + return localVarFp.signalSchedule(signalScheduleRequest, options).then((request) => request(axios, basePath)); + }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -73432,6 +73977,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any) { + return PlaidApiFp(this.configuration).craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -75400,6 +75957,18 @@ export class PlaidApi extends BaseAPI { return PlaidApiFp(this.configuration).signalReturnReport(signalReturnReportRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + public signalSchedule(signalScheduleRequest: SignalScheduleRequest, options?: any) { + return PlaidApiFp(this.configuration).signalSchedule(signalScheduleRequest, options).then((request) => request(this.axios, this.basePath)); + } + /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. diff --git a/base.ts b/base.ts index 9321c92f..26c9c139 100644 --- a/base.ts +++ b/base.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/common.ts b/common.ts index 3871fd6e..6ff2e0b4 100644 --- a/common.ts +++ b/common.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/configuration.ts b/configuration.ts index f2dc7238..2429f03d 100644 --- a/configuration.ts +++ b/configuration.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -96,7 +96,7 @@ export class Configuration { if(!this.baseOptions) this.baseOptions = {}; if(!this.baseOptions.headers) this.baseOptions.headers = {}; this.baseOptions.headers = { - ['User-Agent']: `Plaid Node v30.1.0`, + ['User-Agent']: `Plaid Node v31.0.0`, ['Plaid-Version']: '2020-09-14', ...this.baseOptions.headers, } diff --git a/dist/api.d.ts b/dist/api.d.ts index 675dd507..37f48bef 100644 --- a/dist/api.d.ts +++ b/dist/api.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -267,7 +267,7 @@ export interface AccountBase { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountBase */ @@ -428,7 +428,7 @@ export interface AccountIdentity { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountIdentity */ @@ -536,7 +536,7 @@ export interface AccountIdentityDocumentUpload { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountIdentityDocumentUpload */ @@ -656,7 +656,7 @@ export interface AccountIdentityMatchScore { */ balances: AccountBalance; /** - * The last 2-4 alphanumeric characters of an account\'s official account number. Note that the mask may be non-unique between an Item\'s accounts, and it may also not match the mask that the bank displays to the user. + * The last 2-4 alphanumeric characters of either the account’s displayed mask or the account’s official account number. Note that the mask may be non-unique between an Item’s accounts. * @type {string} * @memberof AccountIdentityMatchScore */ @@ -2911,7 +2911,7 @@ export declare enum AssetReportType { */ export interface AssetReportUser { /** - * An identifier you determine and submit for the user. + * An identifier you determine and submit for the user. If using the Credit Dashboard, Customers should pass in the `user_token` created in `/user/create`. * @type {string} * @memberof AssetReportUser */ @@ -5026,7 +5026,7 @@ export interface BaseReportAccount { */ transactions: Array; /** - * Data returned by the financial institution about the account owner or owners. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. + * Data returned by the financial institution about the account owner or owners. For business accounts, the name reported may be either the name of the individual or the name of the business, depending on the institution. Multiple owners on a single account will be represented in the same `owner` object, not in multiple owner objects within the array. This array can also be empty if no owners are found. * @type {Array} * @memberof BaseReportAccount */ @@ -5148,14 +5148,7 @@ export interface BaseReportAccountInsights { */ average_days_between_transactions?: number; /** - * Deprecated; use `longest_gaps_between_transactions` instead. Longest gap between sequential transactions - * @type {Array} - * @memberof BaseReportAccountInsights - * @deprecated - */ - longest_gap_between_transactions?: Array; - /** - * Customers must transition from `longest_gap_between_transactions` by January 31st 2025. Longest gap between sequential transactions in a time period. This array can include multiple time periods. + * Longest gap between sequential transactions in a time period. This array can include multiple time periods. * @type {Array} * @memberof BaseReportAccountInsights */ @@ -5167,14 +5160,7 @@ export interface BaseReportAccountInsights { */ number_of_inflows?: Array; /** - * Deprecated; use `average_inflow_amounts` instead. Average amount of debit transactions into the account. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. - * @type {Array} - * @memberof BaseReportAccountInsights - * @deprecated - */ - average_inflow_amount?: Array; - /** - * Customers must transition from `average_inflow_amount` by January 31st 2025. Average amount of debit transactions into the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Average amount of debit transactions into the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @type {Array} * @memberof BaseReportAccountInsights */ @@ -5186,14 +5172,7 @@ export interface BaseReportAccountInsights { */ number_of_outflows?: Array; /** - * Deprecated; use `average_outflow_amounts` instead. Average amount of transactions out of the account. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. - * @type {Array} - * @memberof BaseReportAccountInsights - * @deprecated - */ - average_outflow_amount?: Array; - /** - * Customers must transition from `average_outflow_amount` by January 31st 2025. Average amount of transactions out of the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. + * Average amount of transactions out of the account in a time period. This array will be empty for non-depository accounts. This field only takes into account USD transactions from the account. * @type {Array} * @memberof BaseReportAccountInsights */ @@ -8906,7 +8885,7 @@ export interface ConsumerReportUserIdentity { */ ssn_last_4?: string | null; /** - * To be provided in the format \"yyyy-mm-dd\". This field is required for any clients who became Plaid Check customers on or after Oct 1, 2024. This field will be required for all Plaid Check customers as of Feb 1, 2025. + * To be provided in the format \"yyyy-mm-dd\". This field is required for all Plaid Check customers. * @type {string} * @memberof ConsumerReportUserIdentity */ @@ -9874,6 +9853,75 @@ export interface CraCheckReportCashflowInsightsGetOptions { */ attributes_version?: CashflowAttributesVersion | null; } +/** + * CraCheckReportCashflowInsightsGetRequest defines the request schema for `/cra/check_report/cashflow_insights/get`. + * @export + * @interface CraCheckReportCashflowInsightsGetRequest + */ +export interface CraCheckReportCashflowInsightsGetRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + secret?: string; + /** + * The user token associated with the User data is being requested for. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + user_token?: string; + /** + * The third-party user token associated with the requested User data. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + third_party_user_token?: string; + /** + * + * @type {CraCheckReportCashflowInsightsGetOptions} + * @memberof CraCheckReportCashflowInsightsGetRequest + */ + options?: CraCheckReportCashflowInsightsGetOptions | null; +} +/** + * CraCheckReportCashflowInsightsGetResponse defines the response schema for `/cra/check_report/cashflow_insights/get`. + * @export + * @interface CraCheckReportCashflowInsightsGetResponse + */ +export interface CraCheckReportCashflowInsightsGetResponse { + /** + * + * @type {CraCashflowInsightsReport} + * @memberof CraCheckReportCashflowInsightsGetResponse + */ + report: CraCashflowInsightsReport; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof CraCheckReportCashflowInsightsGetResponse + */ + request_id: string; +} +/** + * Defines configuration options to generate a Base Report + * @export + * @interface CraCheckReportCreateBaseReportOptions + */ +export interface CraCheckReportCreateBaseReportOptions { + /** + * Client-generated identifier, which can be used by lenders to track loan applications. + * @type {string} + * @memberof CraCheckReportCreateBaseReportOptions + */ + client_report_id?: string | null; +} /** * CraCheckReportCreateRequest defines the request schema for `/cra/check_report/create`. * @export @@ -9916,6 +9964,30 @@ export interface CraCheckReportCreateRequest { * @memberof CraCheckReportCreateRequest */ days_required?: number; + /** + * Specifies a list of products that will be eagerly generated when creating the report. These products will be made available before a success webhook is sent. Use this option to minimize response latency for product `/get` endpoints. + * @type {Array} + * @memberof CraCheckReportCreateRequest + */ + products?: Array | null; + /** + * + * @type {CraCheckReportCreateBaseReportOptions} + * @memberof CraCheckReportCreateRequest + */ + base_report?: CraCheckReportCreateBaseReportOptions | null; + /** + * + * @type {CraCheckReportCashflowInsightsGetOptions} + * @memberof CraCheckReportCreateRequest + */ + cashflow_insights?: CraCheckReportCashflowInsightsGetOptions | null; + /** + * + * @type {CraCheckReportPartnerInsightsGetOptions} + * @memberof CraCheckReportCreateRequest + */ + partner_insights?: CraCheckReportPartnerInsightsGetOptions | null; /** * * @type {ConsumerReportPermissiblePurpose} @@ -22125,7 +22197,7 @@ export interface InstitutionStatusAlertWebhook { environment: WebhookEnvironmentValues; } /** - * Contains the RTP network and types supported by the linked Item\'s institution. + * Contains the RTP and RfP network and types supported by the linked Item\'s institution. * @export * @interface InstitutionSupportedNetworks */ @@ -22136,6 +22208,12 @@ export interface InstitutionSupportedNetworks { * @memberof InstitutionSupportedNetworks */ rtp: TransferCapabilitiesGetRTP; + /** + * + * @type {TransferCapabilitiesGetRfP} + * @memberof InstitutionSupportedNetworks + */ + rfp: TransferCapabilitiesGetRfP; } /** * InstitutionsGetByIdRequest defines the request schema for `/institutions/get_by_id` @@ -22727,6 +22805,99 @@ export declare enum InvestmentTransactionType { Fee = "fee", Transfer = "transfer" } +/** + * Object containing information on contribution transactions for the 401k account. + * @export + * @interface InvestmentsAuth401kContributionDetails + */ +export interface InvestmentsAuth401kContributionDetails { + /** + * A list of the most recent contribution transactions for the 401k account. Includes all contributions made on the same day. + * @type {Array} + * @memberof InvestmentsAuth401kContributionDetails + */ + last_contribution_transactions: Array; + /** + * Number of contribution transactions on this account, for the past month. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_count_1m: number; + /** + * Sum of the contribution transactions on this account, for the past month. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_amount_1m: number; + /** + * Number of contribution transactions on this account, for the past 6 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_count_6m: number; + /** + * Sum of the contribution transactions on this account, for the past 6 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_amount_6m: number; + /** + * Number of contribution transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_count_12m: number; + /** + * Sum of the contribution transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kContributionDetails + */ + contribution_amount_12m: number; +} +/** + * Object containing information on account fee transactions for the 401k account. + * @export + * @interface InvestmentsAuth401kFeeDetails + */ +export interface InvestmentsAuth401kFeeDetails { + /** + * Number of account fee transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kFeeDetails + */ + account_fee_count_12m: number; + /** + * Sum of account fee transactions on this account, for the past 12 months. + * @type {number} + * @memberof InvestmentsAuth401kFeeDetails + */ + account_fee_amount_12m: number; +} +/** + * Additional account fee and contribution information for 401k type accounts. + * @export + * @interface InvestmentsAuthAccountDetails401k + */ +export interface InvestmentsAuthAccountDetails401k { + /** + * The ID of the 401k account. + * @type {string} + * @memberof InvestmentsAuthAccountDetails401k + */ + account_id?: string; + /** + * + * @type {InvestmentsAuth401kFeeDetails} + * @memberof InvestmentsAuthAccountDetails401k + */ + fee_details?: InvestmentsAuth401kFeeDetails; + /** + * + * @type {InvestmentsAuth401kContributionDetails} + * @memberof InvestmentsAuthAccountDetails401k + */ + contribution_details?: InvestmentsAuth401kContributionDetails; +} /** * Object with metadata pertaining to the source of data for the account numbers, owners, and holdings that are returned. * @export @@ -22770,6 +22941,12 @@ export interface InvestmentsAuthGetNumbers { * @memberof InvestmentsAuthGetNumbers */ aton?: Array; + /** + * + * @type {Array} + * @memberof InvestmentsAuthGetNumbers + */ + retirement_401k?: Array; } /** * InvestmentsAuthGetRequest defines the request schema for `/investments/auth/get` @@ -22857,6 +23034,12 @@ export interface InvestmentsAuthGetResponse { * @memberof InvestmentsAuthGetResponse */ data_sources: InvestmentsAuthDataSources; + /** + * Additional information for accounts of 401k subtype. + * @type {Array} + * @memberof InvestmentsAuthGetResponse + */ + account_details_401k?: Array; /** * * @type {Item} @@ -26491,6 +26674,19 @@ export interface LinkTokenAccountFilters { */ other?: OtherFilter; } +/** + * Configuration parameters for the Cashflow Report product. Currently in closed beta. + * @export + * @interface LinkTokenCashflowReport + */ +export interface LinkTokenCashflowReport { + /** + * Number of days of transaction history to request in the Cashflow Report product. + * @type {number} + * @memberof LinkTokenCashflowReport + */ + days_requested?: number; +} /** * A map containing data to pass in for the Card Switch flow. * @export @@ -27554,7 +27750,7 @@ export interface LinkTokenCreateResponse { */ link_token: string; /** - * The expiration date for the `link_token`, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format. By default, a `link_token` created to generate a `public_token` that will be exchanged for a new `access_token` expires after 4 hours, and a `link_token` created for an existing Item (such as when updating an existing `access_token` by launching Link in update mode) expires after 30 minutes. If using [Hosted Link](https://plaid.com/docs/link/hosted-link/), the `link_token` will expire at the same time as the Hosted Link URL, and you can customize the duration using the `hosted_link.url_lifetime_seconds` option in the request. If using Link Delivery (beta), the `link_token` will expire by default after 24 hours if sent via SMS and after 7 days if sent via email. + * The expiration date and time for the `link_token`, in [ISO 8601](https://wikipedia.org/wiki/ISO_8601) format. By default, a `link_token` created to generate a `public_token` that will be exchanged for a new `access_token` expires after 4 hours, and a `link_token` created for an existing Item (such as when updating an existing `access_token` by launching Link in update mode) expires after 30 minutes. If using [Hosted Link](https://plaid.com/docs/link/hosted-link/), the `link_token` will expire at the same time as the Hosted Link URL, and you can customize the duration using the `hosted_link.url_lifetime_seconds` option in the request. If using Link Delivery (beta), the `link_token` will expire by default after 24 hours if sent via SMS and after 7 days if sent via email. If using Identity Verification, Link token expiration will not be enforced; an Identity Verification Link session can be created with an expired Link token. * @type {string} * @memberof LinkTokenCreateResponse */ @@ -28333,7 +28529,7 @@ export declare enum MonitoringInsightsStatus { Unhealthy = "UNHEALTHY" } /** - * For each user enabled for Cash Flow Updates, this webhook will fire every 14 days with information on the status of the update. Upon receiving the webhook, call `/cra/monitoring_insights/get` to retrieve the updated insights. + * For each user enabled for Cash Flow Updates, this webhook will fire every day with information on the status of the update. Upon receiving the webhook, call `/cra/monitoring_insights/get` to retrieve the updated insights. * @export * @interface MonitoringInsightsWebhook */ @@ -29302,6 +29498,31 @@ export interface NumbersInternationalNullable { */ bic: string; } +/** + * Identifying information for transferring holdings from a 401k account to another 401k account or IRA via the manual 401k rollover process. + * @export + * @interface NumbersRetirement401k + */ +export interface NumbersRetirement401k { + /** + * The Plaid account ID associated with the account numbers + * @type {string} + * @memberof NumbersRetirement401k + */ + account_id: string; + /** + * The plan number for the employer\'s 401k retirement plan + * @type {string} + * @memberof NumbersRetirement401k + */ + plan?: string; + /** + * The full account number for the account + * @type {string} + * @memberof NumbersRetirement401k + */ + account?: string; +} /** * The type of transfer. Valid values are `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. This field is omitted for Plaid Ledger Sweep events. * @export @@ -29342,6 +29563,37 @@ export interface OptionContract { */ underlying_security_ticker: string; } +/** + * The original source of the funds. This field is required by local regulation for certain businesses (e.g. money remittance) to send payouts to recipients in the EU and UK. + * @export + * @interface OriginatingFundSource + */ +export interface OriginatingFundSource { + /** + * The full name associated with the source of the funds. + * @type {string} + * @memberof OriginatingFundSource + */ + full_name: string; + /** + * + * @type {PaymentInitiationAddress} + * @memberof OriginatingFundSource + */ + address: PaymentInitiationAddress | null; + /** + * The account number from which the funds are sourced. + * @type {string} + * @memberof OriginatingFundSource + */ + account_number: string; + /** + * The Business Identifier Code, also known as SWIFT code, for this bank account. + * @type {string} + * @memberof OriginatingFundSource + */ + bic: string; +} /** * Originator and their status. * @export @@ -31743,6 +31995,12 @@ export interface PaymentInitiationPayment { * @memberof PaymentInitiationPayment */ transaction_id?: string | null; + /** + * A unique identifier assigned by Plaid to each payment for tracking and reconcilliation purposes. Note: Not all banks handle end_to_end_id consistently. To ensure accurate matching, clients should convert both the incoming end_to_end_id and the one provided by Plaid to the same case (either lower or upper) before comparison. For virtual account payments, Plaid manages this field automatically. + * @type {string} + * @memberof PaymentInitiationPayment + */ + end_to_end_id?: string | null; } /** * PaymentInitiationPaymentCreateRequest defines the request schema for `/payment_initiation/payment/create` @@ -31965,6 +32223,12 @@ export interface PaymentInitiationPaymentGetResponse { * @memberof PaymentInitiationPaymentGetResponse */ transaction_id?: string | null; + /** + * A unique identifier assigned by Plaid to each payment for tracking and reconcilliation purposes. Note: Not all banks handle end_to_end_id consistently. To ensure accurate matching, clients should convert both the incoming end_to_end_id and the one provided by Plaid to the same case (either lower or upper) before comparison. For virtual account payments, Plaid manages this field automatically. + * @type {string} + * @memberof PaymentInitiationPaymentGetResponse + */ + end_to_end_id?: string | null; /** * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. * @type {string} @@ -35575,7 +35839,8 @@ export declare enum ProcessorTokenCreateRequestProcessorEnum { Esusu = "esusu", Ansa = "ansa", Scribeup = "scribeup", - Straddle = "straddle" + Straddle = "straddle", + Loanpro = "loanpro" } /** * ProcessorTokenCreateResponse defines the response schema for `/processor/token/create` and `/processor/apex/processor_token/create` @@ -36543,6 +36808,16 @@ export interface RecipientBACSNullable { */ sort_code?: string; } +/** + * The recommendation result for that date. + * @export + * @enum {string} + */ +export declare enum RecommendationString { + Recommended = "RECOMMENDED", + NotRecommended = "NOT_RECOMMENDED", + Unknown = "UNKNOWN" +} /** * Insights relating to expenses and deposits that are predicted to occur on a scheduled basis, such as biweekly, monthly, or annually. Common examples include loan payments, bill payments, subscriptions, and payroll income. This is a beta field, available to all users. * @export @@ -40969,6 +41244,123 @@ export interface SignalReturnReportResponse { */ request_id: string; } +/** + * The payment method specified in the `default_payment_method` field directly impacts the timing recommendations provided by the API for submitting the debit entry to your processor or ODFI. If unspecified, Signal defaults to `STANDARD_ACH`. `SAME_DAY_ACH`: Same Day ACH (as defined by Nacha). The Signal API assumes the settlement will occur on the same business day if the `/signal/schedule` request is submitted by 6:00 PM UTC. Note: The actual cutoff time can vary depending on your payment processor or ODFI. NACHA has established three processing windows for Same Day ACH (UTC): 2:30 PM, 6:45 PM, and 8:45 PM. `STANDARD_ACH`: Standard ACH (as defined by Nacha), typically settled one to three business days after submission. `REAL_TIME_PAYMENTS`: Real-time payments via Request for Payment through networks such as RTP (The Clearing House) and FedNow, where the consumer can authorize the payment in response to a RFP, and the transaction is processed and settled immediately. `DEBIT_CARD`: Payments processed over debit card networks, leveraging the card-based infrastructure for real-time or near-real-time settlement. `MULTIPLE_PAYMENT_METHODS`: Indicates that there is no default debit rail or multiple payment methods are available, and the transaction could use any of them based on customer policy or availability. + * @export + * @enum {string} + */ +export declare enum SignalScheduleDefaultPaymentMethod { + SameDayAch = "SAME_DAY_ACH", + StandardAch = "STANDARD_ACH", + RealTimePayments = "REAL_TIME_PAYMENTS", + DebitCard = "DEBIT_CARD", + MultiplePaymentMethods = "MULTIPLE_PAYMENT_METHODS" +} +/** + * Conveys information on if a retry is recommended on a given date + * @export + * @interface SignalScheduleRecommendation + */ +export interface SignalScheduleRecommendation { + /** + * The specific date for submitting the debit entry, formatted in ISO 8601 (e.g., \"2025-01-17\"). + * @type {string} + * @memberof SignalScheduleRecommendation + */ + date?: string; + /** + * + * @type {RecommendationString} + * @memberof SignalScheduleRecommendation + */ + recommendation?: RecommendationString; + /** + * The rank of the recommendation based on the likelihood of debit success, with 1 representing the most optimal date. Dates with `NOT_RECOMMENDED` or `UNKNOWN` will have rank `null`. + * @type {number} + * @memberof SignalScheduleRecommendation + */ + rank?: number | null; +} +/** + * SignalScheduleRequest defines the request schema for `/signal/schedule` + * @export + * @interface SignalScheduleRequest + */ +export interface SignalScheduleRequest { + /** + * Your Plaid API `client_id`. The `client_id` is required and may be provided either in the `PLAID-CLIENT-ID` header or as part of a request body. + * @type {string} + * @memberof SignalScheduleRequest + */ + client_id?: string; + /** + * Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body. + * @type {string} + * @memberof SignalScheduleRequest + */ + secret?: string; + /** + * The access token associated with the Item data is being requested for. + * @type {string} + * @memberof SignalScheduleRequest + */ + access_token: string; + /** + * The Plaid `account_id` of the account that is the funding source for the proposed transaction. The `account_id` is returned in the `/accounts/get` endpoint as well as the [`onSuccess`](/docs/link/ios/#link-ios-onsuccess-linkSuccess-metadata-accounts-id) callback metadata. This will return an [`INVALID_ACCOUNT_ID`](/docs/errors/invalid-input/#invalid_account_id) error if the account has been removed at the bank or if the `account_id` is no longer valid. + * @type {string} + * @memberof SignalScheduleRequest + */ + account_id: string; + /** + * The unique ID that you would like to use to refer to this transaction. For your convenience mapping your internal data, you could use your internal ID/identifier for this transaction. The max length for this field is 36 characters. + * @type {string} + * @memberof SignalScheduleRequest + */ + client_transaction_id: string; + /** + * The transaction amount, in USD (e.g. `102.05`) + * @type {number} + * @memberof SignalScheduleRequest + */ + amount: number; + /** + * + * @type {SignalScheduleDefaultPaymentMethod} + * @memberof SignalScheduleRequest + */ + default_payment_method?: SignalScheduleDefaultPaymentMethod; +} +/** + * SignalScheduleResponse defines the response schema for `/signal/schedule` + * @export + * @interface SignalScheduleResponse + */ +export interface SignalScheduleResponse { + /** + * The recommended optimal date to submit the debit entry, formatted in ISO 8601 \"YYYY-MM-DD\" (e.g., \"2024-03-30\"). The `optimal_date` is derived from the date with rank = 1 in the following recommendations array. NOTE: The `default_payment_method` field specified in the request will affect the recommendation, since we\'re accounting for debit settlement time. The debit scheduling evaluation starts from the day the /signal/schedule request is submitted (Day 0) or the next banking day if the submission day is not a banking day, and extends through the following five banking days (Day 1 to Day 5). If no date within this period is considered likely to result in a successful debit attempt, `null` will be returned for the `optimal_date`. + * @type {string} + * @memberof SignalScheduleResponse + */ + optimal_date: string | null; + /** + * This array provides a date-by-date evaluation of debit submission recommendations within the five banking day evaluation period. Each object in the array represents a retry recommendation for a specific date. + * @type {Array} + * @memberof SignalScheduleResponse + */ + recommendations: Array; + /** + * If bank information was not available to be used in the Signal model, this array contains warnings describing why bank data is missing. If you want to receive an API error instead of Signal scores in the case of missing bank data, file a support ticket or contact your Plaid account manager. + * @type {Array} + * @memberof SignalScheduleResponse + */ + warnings: Array; + /** + * A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive. + * @type {string} + * @memberof SignalScheduleResponse + */ + request_id: string; +} /** * Risk scoring details broken down by risk category. * @export @@ -44985,6 +45377,19 @@ export interface TransferCapabilitiesGetResponse { */ request_id: string; } +/** + * Contains the supported service types in RfP + * @export + * @interface TransferCapabilitiesGetRfP + */ +export interface TransferCapabilitiesGetRfP { + /** + * When `true`, the linked Item\'s institution supports RfP debit transfer. + * @type {boolean} + * @memberof TransferCapabilitiesGetRfP + */ + debit?: boolean; +} /** * Defines the request schema for `/transfer/configuration/get` * @export @@ -48181,7 +48586,7 @@ export interface TransferRefundFailure { */ failure_code?: string | null; /** - * The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). + * The ACH return code, e.g. `R01`. A return code will be provided if and only if the refund status is `returned`. For a full listing of ACH return codes, see [Transfer errors](https://plaid.com/docs/errors/transfer/#ach-return-codes). This field is deprecated in favor of the more versatile `failure_code`, which encompasses non-ACH failure codes as well. * @type {string} * @memberof TransferRefundFailure * @deprecated @@ -50852,6 +51257,12 @@ export interface WalletTransactionExecuteRequest { * @memberof WalletTransactionExecuteRequest */ reference: string; + /** + * + * @type {OriginatingFundSource} + * @memberof WalletTransactionExecuteRequest + */ + originating_fund_source?: OriginatingFundSource | null; } /** * WalletTransactionExecuteResponse defines the response schema for `/wallet/transaction/execute` @@ -53606,6 +54017,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ craCheckReportBaseReportGet: (craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any) => Promise; + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet: (craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any) => Promise; /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -54922,6 +55341,14 @@ export declare const PlaidApiAxiosParamCreator: (configuration?: Configuration | * @throws {RequiredError} */ signalReturnReport: (signalReturnReportRequest: SignalReturnReportRequest, options?: any) => Promise; + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule: (signalScheduleRequest: SignalScheduleRequest, options?: any) => Promise; /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -55960,6 +56387,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -57278,6 +57713,14 @@ export declare const PlaidApiFp: (configuration?: Configuration | undefined) => * @throws {RequiredError} */ signalReturnReport(signalReturnReportRequest: SignalReturnReportRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule(signalScheduleRequest: SignalScheduleRequest, options?: any): Promise<(axios?: AxiosInstance | undefined, basePath?: string | undefined) => AxiosPromise>; /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -58316,6 +58759,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): AxiosPromise; + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any): AxiosPromise; /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -59634,6 +60085,14 @@ export declare const PlaidApiFactory: (configuration?: Configuration | undefined * @throws {RequiredError} */ signalReturnReport(signalReturnReportRequest: SignalReturnReportRequest, options?: any): AxiosPromise; + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule(signalScheduleRequest: SignalScheduleRequest, options?: any): AxiosPromise; /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -60716,6 +61175,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest: CraCheckReportBaseReportGetRequest, options?: any): Promise>; + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest: CraCheckReportCashflowInsightsGetRequest, options?: any): Promise>; /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -62198,6 +62666,15 @@ export declare class PlaidApi extends BaseAPI { * @memberof PlaidApi */ signalReturnReport(signalReturnReportRequest: SignalReturnReportRequest, options?: any): Promise>; + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + signalSchedule(signalScheduleRequest: SignalScheduleRequest, options?: any): Promise>; /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. diff --git a/dist/api.js b/dist/api.js index 8ab62a9f..4765389d 100644 --- a/dist/api.js +++ b/dist/api.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -28,9 +28,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.CraBankIncomeCompleteResult = exports.CraBankIncomeBonusType = exports.CountryCode = exports.CounterpartyType = exports.ConsumerReportPermissiblePurpose = exports.ConsumerDisputeCategory = exports.ConsentEventType = exports.ConsentEventInitiator = exports.ConsentEventCode = exports.CashflowAttributesVersion = exports.BeaconUserStatus = exports.BeaconReportType = exports.BeaconReportCreateType = exports.BeaconMatchSummaryCode = exports.BeaconAuditTrailSource = exports.BeaconAccountRiskEvaluateEvaluationReason = exports.BaseReportWarningCode = exports.BaseReportTransactionType = exports.BankTransferType = exports.BankTransferStatus = exports.BankTransferNetwork = exports.BankTransferEventType = exports.BankTransferEventListDirection = exports.BankTransferEventListBankTransferType = exports.BankTransferDirection = exports.BankIncomeRefreshCompleteResult = exports.BankIncomeCompleteResult = exports.BalancePlusRiskLevel = exports.AuthUpdateTypes = exports.AssetType = exports.AssetTransactionType = exports.AssetTransactionCategoryType = exports.AssetReportType = exports.AssetReportTransactionType = exports.AssetReportAddOns = exports.AddressPurposeLabel = exports.ActivityType = exports.ActionState = exports.AccountVerificationInsightsAccountNumberFormat = exports.AccountType = exports.AccountSubtype = exports.AccountSelectionCardinality = exports.AccountIdentityMatchScoreVerificationStatusEnum = exports.AccountIdentityDocumentUploadVerificationStatusEnum = exports.AccountIdentityVerificationStatusEnum = exports.AccountHolderCategory = exports.AccountBaseVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum = exports.APRAprTypeEnum = exports.ACHClass = void 0; exports.FraudCheckOutcome = exports.Form1099Type = exports.FDXPartyType = exports.FDXPartyRegistry = exports.FDXNotificationType = exports.FDXNotificationSeverity = exports.FDXNotificationPriority = exports.FDXNotificationPayloadIdType = exports.FDXNotificationCategory = exports.FDXHateoasLinkAction = exports.FDXContentTypes = exports.ExpirationDate = exports.EntityWatchlistCode = exports.EntityDocumentType = exports.EnrichTransactionDirection = exports.EmploymentVerificationStatus = exports.EmploymentSourceType = exports.EmailTypeEnum = exports.EarningsBreakdownCanonicalDescription = exports.DocumentStatus = exports.DocumentNameMatchCode = exports.DocumentDateOfBirthMatchCode = exports.DocumentAuthenticityMatchCode = exports.DocType = exports.DepositoryAccountSubtype = exports.DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseStateEnum = exports.DepositSwitchCreateRequestCountryCodeEnum = exports.DepositSwitchAltCreateRequestCountryCodeEnum = exports.DataSources = exports.DashboardUserStatus = exports.CreditSessionBankIncomeStatus = exports.CreditSessionBankEmploymentStatus = exports.CreditPayStubPayBasisType = exports.CreditBankIncomeWarningType = exports.CreditBankIncomeWarningCode = exports.CreditBankIncomePayFrequency = exports.CreditBankIncomeErrorType = exports.CreditBankIncomeCategory = exports.CreditBankIncomeAccountType = exports.CreditBankEmploymentWarningType = exports.CreditAccountSubtype = exports.CreditACHClass = exports.CraPDFAddOns = exports.CraLoanType = exports.CraLoanStatus = exports.CraLoanPaymentSchedule = exports.CraLoanApplicationDecision = exports.CraBankIncomeWarningCode = void 0; exports.OwnershipType = exports.OverrideAccountType = exports.OtherAccountSubtype = exports.OriginatorExpectedTransferFrequency = exports.OmittableTransferType = exports.NetworkStatusGetResponseNetworkStatus = exports.MonitoringItemStatusCode = exports.MonitoringInsightsStatus = exports.MonitoringConsumerReportPermissiblePurpose = exports.MatchSummaryCode = exports.LoanIdentifierType = exports.LoanAccountSubtype = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkSessionSuccessMetadataTransferStatus = exports.LinkEventName = exports.LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCallbackType = exports.LinkDeliveryVerificationStatus = exports.LinkDeliverySessionStatus = exports.LinkDeliveryDeliveryMethod = exports.ItemWithConsentFieldsUpdateTypeEnum = exports.ItemCreateAuthentication = exports.ItemConsentedDataScope = exports.ItemAuthMethod = exports.ItemUpdateTypeEnum = exports.IssuingCountry = exports.IssuesStatus = exports.InvestmentTransactionType = exports.InvestmentTransactionSubtype = exports.InvestmentAccountSubtype = exports.IndividualWatchlistCode = exports.IncomeVerificationSourceType = exports.IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPayrollFlowType = exports.IncomeVerificationDocParsingConfig = exports.IncomeBreakdownType = exports.IncidentUpdateStatusEnum = exports.ImageQualityOutcome = exports.ImageQuality = exports.IdentityVerificationStepStatus = exports.IdentityVerificationStatus = exports.IdentityVerificationAutofillStatus = exports.IdentityUpdateTypes = exports.ISOCurrencyCode = exports.IDNumberType = exports.HostedLinkDeliveryMethod = exports.HiddenMatchSummaryCode = exports.FraudCheckOutcomeWithNoData = void 0; -exports.RiskCheckLinkedService = exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel = exports.ReportType = exports.RecurringTransactionFrequency = exports.RecurringFrequency = exports.ProxyType = exports.ProgramNameSensitivity = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PrismProduct = exports.PrismInsightsVersion = exports.PrismFirstDetectVersion = exports.PrismCashScoreVersion = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PendingDisconnectWebhookReason = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentType = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentInitiationConsentProcessingMode = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequency = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.POBoxStatus = void 0; -exports.TransferEventType = exports.TransferEventListTransferType = exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsUpdateStatus = exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisLivenessCheck = exports.SelfieAnalysisFacialAnalysisOutcome = exports.SelfieAnalysisDocumentComparison = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.SMSVerificationStatus = exports.RiskSignalFileType = exports.RiskSignalDocumentType = exports.RiskSignalDocumentStatus = exports.RiskLevelWithNoData = exports.RiskLevel = void 0; -exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.YieldRateType = exports.WebhookType = exports.WebhookEnvironmentValues = exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionRelationTypeEnum = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerifySMSDetailsStatus = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferRecurringNetwork = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = void 0; +exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel = exports.ReportType = exports.RecurringTransactionFrequency = exports.RecurringFrequency = exports.RecommendationString = exports.ProxyType = exports.ProgramNameSensitivity = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PrismProduct = exports.PrismInsightsVersion = exports.PrismFirstDetectVersion = exports.PrismCashScoreVersion = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PendingDisconnectWebhookReason = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentType = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentInitiationConsentProcessingMode = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequency = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.POBoxStatus = void 0; +exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsUpdateStatus = exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalScheduleDefaultPaymentMethod = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisLivenessCheck = exports.SelfieAnalysisFacialAnalysisOutcome = exports.SelfieAnalysisDocumentComparison = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.SMSVerificationStatus = exports.RiskSignalFileType = exports.RiskSignalDocumentType = exports.RiskSignalDocumentStatus = exports.RiskLevelWithNoData = exports.RiskLevel = exports.RiskCheckLinkedService = void 0; +exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.YieldRateType = exports.WebhookType = exports.WebhookEnvironmentValues = exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionRelationTypeEnum = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerifySMSDetailsStatus = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferRecurringNetwork = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = exports.TransferEventType = exports.TransferEventListTransferType = void 0; const axios_1 = __importDefault(require("axios")); // Some imports not used depending on template conditions // @ts-ignore @@ -2679,6 +2679,7 @@ var ProcessorTokenCreateRequestProcessorEnum; ProcessorTokenCreateRequestProcessorEnum["Ansa"] = "ansa"; ProcessorTokenCreateRequestProcessorEnum["Scribeup"] = "scribeup"; ProcessorTokenCreateRequestProcessorEnum["Straddle"] = "straddle"; + ProcessorTokenCreateRequestProcessorEnum["Loanpro"] = "loanpro"; })(ProcessorTokenCreateRequestProcessorEnum = exports.ProcessorTokenCreateRequestProcessorEnum || (exports.ProcessorTokenCreateRequestProcessorEnum = {})); /** * @export @@ -2766,6 +2767,17 @@ var ProxyType; ProxyType["WebProxy"] = "web_proxy"; ProxyType["PublicProxy"] = "public_proxy"; })(ProxyType = exports.ProxyType || (exports.ProxyType = {})); +/** + * The recommendation result for that date. + * @export + * @enum {string} + */ +var RecommendationString; +(function (RecommendationString) { + RecommendationString["Recommended"] = "RECOMMENDED"; + RecommendationString["NotRecommended"] = "NOT_RECOMMENDED"; + RecommendationString["Unknown"] = "UNKNOWN"; +})(RecommendationString = exports.RecommendationString || (exports.RecommendationString = {})); /** * Describes the frequency of the transaction stream. `WEEKLY`: Assigned to a transaction stream that occurs approximately every week. `BIWEEKLY`: Assigned to a transaction stream that occurs approximately every 2 weeks. `SEMI_MONTHLY`: Assigned to a transaction stream that occurs approximately twice per month. This frequency is typically seen for inflow transaction streams. `MONTHLY`: Assigned to a transaction stream that occurs approximately every month. `ANNUALLY`: Assigned to a transaction stream that occurs approximately every year. `DAILY`: Assigned to a transaction stream that occurs approximately every day. `DYNAMIC`: Assigned to a transaction stream that varies in recurrence frequency. This frequency is typically seen for inflow streams in the gig economy. `UNKNOWN`: Assigned to a transaction stream that isn\'t recurring in nature. * @export @@ -3231,6 +3243,19 @@ var SignalPaymentMethod; SignalPaymentMethod["DebitCard"] = "DEBIT_CARD"; SignalPaymentMethod["MultiplePaymentMethods"] = "MULTIPLE_PAYMENT_METHODS"; })(SignalPaymentMethod = exports.SignalPaymentMethod || (exports.SignalPaymentMethod = {})); +/** + * The payment method specified in the `default_payment_method` field directly impacts the timing recommendations provided by the API for submitting the debit entry to your processor or ODFI. If unspecified, Signal defaults to `STANDARD_ACH`. `SAME_DAY_ACH`: Same Day ACH (as defined by Nacha). The Signal API assumes the settlement will occur on the same business day if the `/signal/schedule` request is submitted by 6:00 PM UTC. Note: The actual cutoff time can vary depending on your payment processor or ODFI. NACHA has established three processing windows for Same Day ACH (UTC): 2:30 PM, 6:45 PM, and 8:45 PM. `STANDARD_ACH`: Standard ACH (as defined by Nacha), typically settled one to three business days after submission. `REAL_TIME_PAYMENTS`: Real-time payments via Request for Payment through networks such as RTP (The Clearing House) and FedNow, where the consumer can authorize the payment in response to a RFP, and the transaction is processed and settled immediately. `DEBIT_CARD`: Payments processed over debit card networks, leveraging the card-based infrastructure for real-time or near-real-time settlement. `MULTIPLE_PAYMENT_METHODS`: Indicates that there is no default debit rail or multiple payment methods are available, and the transaction could use any of them based on customer policy or availability. + * @export + * @enum {string} + */ +var SignalScheduleDefaultPaymentMethod; +(function (SignalScheduleDefaultPaymentMethod) { + SignalScheduleDefaultPaymentMethod["SameDayAch"] = "SAME_DAY_ACH"; + SignalScheduleDefaultPaymentMethod["StandardAch"] = "STANDARD_ACH"; + SignalScheduleDefaultPaymentMethod["RealTimePayments"] = "REAL_TIME_PAYMENTS"; + SignalScheduleDefaultPaymentMethod["DebitCard"] = "DEBIT_CARD"; + SignalScheduleDefaultPaymentMethod["MultiplePaymentMethods"] = "MULTIPLE_PAYMENT_METHODS"; +})(SignalScheduleDefaultPaymentMethod = exports.SignalScheduleDefaultPaymentMethod || (exports.SignalScheduleDefaultPaymentMethod = {})); /** * A type indicating whether a dashboard user, an API-based user, or Plaid last touched this object. * @export @@ -5601,6 +5626,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet: (craCheckReportCashflowInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'craCheckReportCashflowInsightsGetRequest' is not null or undefined + common_1.assertParamExists('craCheckReportCashflowInsightsGet', 'craCheckReportCashflowInsightsGetRequest', craCheckReportCashflowInsightsGetRequest); + const localVarPath = `/cra/check_report/cashflow_insights/get`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportCashflowInsightsGetRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -11503,6 +11564,42 @@ const PlaidApiAxiosParamCreator = function (configuration) { options: localVarRequestOptions, }; }), + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule: (signalScheduleRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { + // verify required parameter 'signalScheduleRequest' is not null or undefined + common_1.assertParamExists('signalSchedule', 'signalScheduleRequest', signalScheduleRequest); + const localVarPath = `/signal/schedule`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); + const localVarHeaderParameter = {}; + const localVarQueryParameter = {}; + // authentication clientId required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); + // authentication plaidVersion required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); + // authentication secret required + yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); + localVarHeaderParameter['Content-Type'] = 'application/json'; + common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); + localVarRequestOptions.data = common_1.serializeDataIfNeeded(signalScheduleRequest, localVarRequestOptions, configuration); + return { + url: common_1.toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }), /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -15191,6 +15288,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -17323,6 +17433,19 @@ const PlaidApiFp = function (configuration) { return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule(signalScheduleRequest, options) { + return __awaiter(this, void 0, void 0, function* () { + const localVarAxiosArgs = yield localVarAxiosParamCreator.signalSchedule(signalScheduleRequest, options); + return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); + }); + }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -18884,6 +19007,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options) { return localVarFp.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(axios, basePath)); }, + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options) { + return localVarFp.craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options).then((request) => request(axios, basePath)); + }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -20524,6 +20657,16 @@ const PlaidApiFactory = function (configuration, basePath, axios) { signalReturnReport(signalReturnReportRequest, options) { return localVarFp.signalReturnReport(signalReturnReportRequest, options).then((request) => request(axios, basePath)); }, + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + signalSchedule(signalScheduleRequest, options) { + return localVarFp.signalSchedule(signalScheduleRequest, options).then((request) => request(axios, basePath)); + }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -21866,6 +22009,17 @@ class PlaidApi extends base_1.BaseAPI { craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. + * @summary Retrieve cash flow insights from your user\'s banking data + * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options) { + return exports.PlaidApiFp(this.configuration).craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report @@ -23670,6 +23824,17 @@ class PlaidApi extends base_1.BaseAPI { signalReturnReport(signalReturnReportRequest, options) { return exports.PlaidApiFp(this.configuration).signalReturnReport(signalReturnReportRequest, options).then((request) => request(this.axios, this.basePath)); } + /** + * Use `/signal/schedule` to schedule a planned ACH transaction. + * @summary Schedule a planned ACH transaction + * @param {SignalScheduleRequest} signalScheduleRequest + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PlaidApi + */ + signalSchedule(signalScheduleRequest, options) { + return exports.PlaidApiFp(this.configuration).signalSchedule(signalScheduleRequest, options).then((request) => request(this.axios, this.basePath)); + } /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. @@ -24629,4 +24794,4 @@ class PlaidApi extends base_1.BaseAPI { } } exports.PlaidApi = PlaidApi; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUgsa0RBQWlFO0FBQ2pFLHlEQUF5RDtBQUN6RCxhQUFhO0FBQ2IscUNBQTROO0FBQzVOLGFBQWE7QUFDYixpQ0FBNEY7QUFFNUY7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBS25CO0FBa0NEOzs7TUFHTTtBQUNOLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN0Qiw2REFBMkMsQ0FBQTtJQUMzQyxzQ0FBb0IsQ0FBQTtJQUNwQiw4Q0FBNEIsQ0FBQTtJQUM1QixxQ0FBbUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFLekI7QUFtSUQ7OztNQUdNO0FBQ04sSUFBWSxtQ0FRWDtBQVJELFdBQVksbUNBQW1DO0lBQzNDLHVGQUFnRCxDQUFBO0lBQ2hELHNHQUErRCxDQUFBO0lBQy9ELGdHQUF5RCxDQUFBO0lBQ3pELDZFQUFzQyxDQUFBO0lBQ3RDLG1GQUE0QyxDQUFBO0lBQzVDLGlGQUEwQyxDQUFBO0lBQzFDLDJFQUFvQyxDQUFBO0FBQ3hDLENBQUMsRUFSVyxtQ0FBbUMsR0FBbkMsMkNBQW1DLEtBQW5DLDJDQUFtQyxRQVE5QztBQXVIRDs7O01BR007QUFDTixJQUFZLGlDQVdYO0FBWEQsV0FBWSxpQ0FBaUM7SUFDekMscUZBQWdELENBQUE7SUFDaEQsb0dBQStELENBQUE7SUFDL0QsOEZBQXlELENBQUE7SUFDekQsMkVBQXNDLENBQUE7SUFDdEMs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SUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNySyxDQUFDO0NBQ0o7QUE1N0dELDRCQTQ3R0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS42MTAuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBEVU1NWV9CQVNFX1VSTCwgYXNzZXJ0UGFyYW1FeGlzdHMsIHNldEFwaUtleVRvT2JqZWN0LCBzZXRCYXNpY0F1dGhUb09iamVjdCwgc2V0QmVhcmVyQXV0aFRvT2JqZWN0LCBzZXRPQXV0aFRvT2JqZWN0LCBzZXRTZWFyY2hQYXJhbXMsIHNlcmlhbGl6ZURhdGFJZk5lZWRlZCwgdG9QYXRoU3RyaW5nLCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gfSBmcm9tICcuL2NvbW1vbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUywgUmVxdWVzdEFyZ3MsIEJhc2VBUEksIFJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHRyYW5zZmVyLiBSZXF1aXJlZCBmb3IgdHJhbnNmZXJzIG9uIGFuIEFDSCBuZXR3b3JrLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0FDSCBTRUMgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvY3JlYXRpbmctdHJhbnNmZXJzLyNhY2gtc2VjLWNvZGVzKS4gIENvZGVzIHN1cHBvcnRlZCBmb3IgY3JlZGl0czogYGNjZGAsIGBwcGRgIENvZGVzIHN1cHBvcnRlZCBmb3IgZGViaXRzOiBgY2NkYCwgYHRlbGAsIGB3ZWJgICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlLmcuIGJpbGwgcGF5bWVudCAgYFxcXCJ0ZWxcXFwiYCAtIFRlbGVwaG9uZS1Jbml0aWF0ZWQgRW50cnkgIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkgLSBkZWJpdHMgZnJvbSBhIGNvbnN1bWVy4oCZcyBhY2NvdW50IHdoZXJlIHRoZWlyIGF1dGhvcml6YXRpb24gaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBUZWwgPSAndGVsJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBBUFIgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFQUlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFQUiB7XG4gICAgLyoqXG4gICAgICogQW5udWFsIFBlcmNlbnRhZ2UgUmF0ZSBhcHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBhcHJfcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGJhbGFuY2UgdG8gd2hpY2ggdGhlIEFQUiBhcHBsaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl90eXBlOiBBUFJBcHJUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbW9uZXkgdGhhdCBpcyBzdWJqZWN0ZWQgdG8gdGhlIEFQUiBpZiBhIGJhbGFuY2Ugd2FzIGNhcnJpZWQgYmV5b25kIHBheW1lbnQgZHVlIGRhdGUuIEhvdyBpdCBpcyBjYWxjdWxhdGVkIGNhbiB2YXJ5IGJ5IGNhcmQgaXNzdWVyLiBJdCBpcyBvZnRlbiBjYWxjdWxhdGVkIGFzIGFuIGF2ZXJhZ2UgZGFpbHkgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBUFJcbiAgICAgKi9cbiAgICBiYWxhbmNlX3N1YmplY3RfdG9fYXByOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSBjaGFyZ2VkIGR1ZSB0byBpbnRlcmVzdCBmcm9tIGxhc3Qgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGludGVyZXN0X2NoYXJnZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQVBSQXByVHlwZUVudW0ge1xuICAgIEJhbGFuY2VUcmFuc2ZlckFwciA9ICdiYWxhbmNlX3RyYW5zZmVyX2FwcicsXG4gICAgQ2FzaEFwciA9ICdjYXNoX2FwcicsXG4gICAgUHVyY2hhc2VBcHIgPSAncHVyY2hhc2VfYXByJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnXG59XG5cbi8qKlxuICogQWxsb3cgb3IgZGlzYWxsb3cgcHJvZHVjdCBhY2Nlc3MgYnkgYWNjb3VudC4gVW5saXN0ZWQgKGUuZy4gbWlzc2luZykgYWNjb3VudHMgd2lsbCBiZSBjb25zaWRlcmVkIGBuZXdfYWNjb3VudHNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QWNjZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEFjY2VzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBhY2NvdW50IGlkZW50aWZpZXIgZm9yIHRoaXMgYWNjb3VudC4gVGhpcyB2YWx1ZSBtdXN0IG1hdGNoIHRoYXQgcmV0dXJuZWQgYnkgdGhlIGRhdGEgYWNjZXNzIEFQSSBmb3IgdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICB1bmlxdWVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gc2VlIHRoaXMgYWNjb3VudCAoYW5kIGFzc29jaWF0ZWQgZGV0YWlscywgaW5jbHVkaW5nIGJhbGFuY2UpIGluIHRoZSBsaXN0IG9mIGFjY291bnRzICBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QWNjZXNzXG4gICAgICovXG4gICAgYXV0aG9yaXplZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudF9wcm9kdWN0X2FjY2Vzcz86IEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldCBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QXNzZXRzIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIEF1dG9tYXRlZCBvciBNYW51YWwgbWljcm8tZGVwb3NpdHMuICBSZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBvbmx5LiAgYHBlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgYXV0b21hdGljIHZlcmlmaWNhdGlvbiAgYHBlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbmA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLiBJdGVtcyByZW1haW4gaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGUgdXNlciBzdWNjZXNzZnVsbHkgdmVyaWZpZXMgdGhlIG1pY3JvLWRlcG9zaXQuICBgYXV0b21hdGljYWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkICAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuIE5vdGU6IERhdGFiYXNlIE1hdGNoIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QXNzZXRzVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgaXMgY3VycmVudGx5IGFuIG9wdC1pbiBmaWVsZCBhbmQgb25seSBzdXBwb3J0ZWQgZm9yIENoYXNlIEl0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRIb2xkZXJDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1cmF0aW9uIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIHJlcG9ydCBmb3IgdGhpcyBJdGVtLCB0eXBpY2FsbHkgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgdHJhbnNhY3Rpb24gaW4gdGhhdCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QXNzZXRSZXBvcnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0SW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEFzc2V0UmVwb3J0SW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy5Gb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge093bmVyc2hpcFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZT86IE93bmVyc2hpcFR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZWQgZGF0YSBhYm91dCB0aGUgaGlzdG9yaWNhbCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9iYWxhbmNlczogQXJyYXk8SGlzdG9yaWNhbEJhbGFuY2U+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnXG59XG5cbi8qKlxuICogQSBzZXQgb2YgZmllbGRzIGRlc2NyaWJpbmcgdGhlIGJhbGFuY2UgZm9yIGFuIGFjY291bnQuIEJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIGJhbGFuY2Ugb2JqZWN0IHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsdGltZSB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIGBjdXJyZW50YCBpcyBgbnVsbGAgdGhpcyBmaWVsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiBvciBvd2VkIGJ5IHRoZSBhY2NvdW50LiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvd2VkOyBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGxvYW5gLXR5cGUgYWNjb3VudHMsIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHByaW5jaXBhbCByZW1haW5pbmcgb24gdGhlIGxvYW4sIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBzdHVkZW50IGxvYW4gYWNjb3VudHMgYXQgU2FsbGllIE1hZSAoYGluc18xMTY5NDRgKS4gRm9yIFNhbGxpZSBNYWUgc3R1ZGVudCBsb2FucywgdGhlIGFjY291bnRcXCdzIGJhbGFuY2UgaW5jbHVkZXMgYm90aCBwcmluY2lwYWwgYW5kIGFueSBvdXRzdGFuZGluZyBpbnRlcmVzdC4gU2ltaWxhciB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaXMgdHlwaWNhbGx5IGV4cGVjdGVkLCB3aGlsZSBhIG5lZ2F0aXZlIGFtb3VudCBpbmRpY2F0ZXMgdGhlIGxlbmRlciBvd2luZyB0aGUgYWNjb3VudCBob2xkZXIuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGltaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgYWNjb3VudCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QmFzZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3MnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzV2l0aENhdXRpb24gPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb24nLFxuICAgIERhdGFiYXNlSW5zaWdodHNGYWlsID0gJ2RhdGFiYXNlX2luc2lnaHRzX2ZhaWwnXG59XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgZm9yIHRoZSB1c2VyIHRvIGJlIGFibGUgdG8gc2VsZWN0IGZyb20uIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gUGxhaWQgZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50IGZpbHRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBgYWNjb3VudF9maWx0ZXJzYCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBhY2NvdW50XFwncyBjYXRlZ29yaXphdGlvbiBhcyBlaXRoZXIgYSBwZXJzb25hbCBvciBhIGJ1c2luZXNzIGFjY291bnQuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IGluIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEhvbGRlckNhdGVnb3J5IHtcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgUGVyc29uYWwgPSAncGVyc29uYWwnLFxuICAgIFVucmVjb2duaXplZCA9ICd1bnJlY29nbml6ZWQnXG59XG5cbi8qKlxuICogSWRlbnRpdHkgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIG1pY3JvLWRlcG9zaXRzIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3NgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzdHJvbmcgc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbmA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNvbWUgc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogIFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNpZ25hbCBmb3IgYmVpbmcgaW52YWxpZCBhbmQvb3IgaGF2ZSBubyBzaWduYWwgZm9yIGJlaW5nIHZhbGlkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEluc2lnaHRzLiBOb3RlOiBEYXRhYmFzZSBJbnNpZ2h0cyBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UgYW5kIFBOQykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgbWF5IGJlIHBvcHVsYXRlZCBmb3IgYW55IGFjY291bnQ7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBob2xkZXJfY2F0ZWdvcnk/OiBBY2NvdW50SG9sZGVyQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eUFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG59XG4vKipcbiAqIElkZW50aXR5IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZCB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgdXBsb2FkZWQgYXMgcHJvb2Ygb2YgYWNjb3VudCBvd25lcnNoaXAuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGRvY3VtZW50cz86IEFycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+IHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIE9ubHkgcmV0dXJuZWQgYnkgSWRlbnRpdHkgb3IgQXNzZXRzIGVuZHBvaW50cy4gRm9yIGJ1c2luZXNzIGFjY291bnRzLCB0aGUgbmFtZSByZXBvcnRlZCBtYXkgYmUgZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIG9yIHRoZSBuYW1lIG9mIHRoZSBidXNpbmVzcywgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbjsgZGV0ZWN0aW5nIHdoZXRoZXIgdGhlIGxpbmtlZCBhY2NvdW50IGlzIGEgYnVzaW5lc3MgYWNjb3VudCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4gTXVsdGlwbGUgb3duZXJzIG9uIGEgc2luZ2xlIGFjY291bnQgd2lsbCBiZSByZXByZXNlbnRlZCBpbiB0aGUgc2FtZSBgb3duZXJgIG9iamVjdCwgbm90IGluIG11bHRpcGxlIG93bmVyIG9iamVjdHMgd2l0aGluIHRoZSBhcnJheS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIGRvY3VtZW50cyB0aGF0IHdlcmUgdXBsb2FkZWQgYXMgcHJvb2Ygb2YgYWNjb3VudCBvd25lcnNoaXAuXG4gICAgICogQHR5cGUge0FycmF5PElkZW50aXR5RG9jdW1lbnRVcGxvYWQ+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGl0eSBtYXRjaCBzY29yZXMgZm9yIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBob2xkZXJfY2F0ZWdvcnk/OiBBY2NvdW50SG9sZGVyQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IFBob25lTnVtYmVyTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtYWlsQWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBQaG9uZU51bWJlck1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbWFpbEFkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHNwZWNpZmljIHByb2R1Y3RzIG9uIHRoaXMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYWNjb3VudCBkYXRhLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2RhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGJhbmsgc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgdGF4X2RvY3VtZW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCBhY2NvdW50cyBiZSBsaW1pdGVkIHRvIGEgc3BlY2lmaWMgY2FyZGluYWxpdHkuIGBNVUxUSV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG11bHRpcGxlIGFjY291bnRzLiBgU0lOR0xFX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgb25seSBhIHNpbmdsZSBhY2NvdW50LiBgQUxMYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgbXVzdCBzaGFyZSBhbGwgb2YgdGhlaXIgYWNjb3VudHMgYW5kIHNob3VsZCBub3QgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIGRlLXNlbGVjdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFNlbGVjdGlvbkNhcmRpbmFsaXR5IHtcbiAgICBTaW5nbGVTZWxlY3QgPSAnU0lOR0xFX1NFTEVDVCcsXG4gICAgTXVsdGlTZWxlY3QgPSAnTVVMVElfU0VMRUNUJyxcbiAgICBBbGwgPSAnQUxMJ1xufVxuXG4vKipcbiAqIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgQ2FzaE1hbmFnZW1lbnQgPSAnY2FzaCBtYW5hZ2VtZW50JyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIENyZWRpdENhcmQgPSAnY3JlZGl0IGNhcmQnLFxuICAgIENyeXB0b0V4Y2hhbmdlID0gJ2NyeXB0byBleGNoYW5nZScsXG4gICAgRWJ0ID0gJ2VidCcsXG4gICAgRWR1Y2F0aW9uU2F2aW5nc0FjY291bnQgPSAnZWR1Y2F0aW9uIHNhdmluZ3MgYWNjb3VudCcsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIExyaWYgPSAnbHJpZicsXG4gICAgTHJzcCA9ICdscnNwJyxcbiAgICBNb25leU1hcmtldCA9ICdtb25leSBtYXJrZXQnLFxuICAgIE1vcnRnYWdlID0gJ21vcnRnYWdlJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBOb25DdXN0b2RpYWxXYWxsZXQgPSAnbm9uLWN1c3RvZGlhbCB3YWxsZXQnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJJbnN1cmFuY2UgPSAnb3RoZXIgaW5zdXJhbmNlJyxcbiAgICBPdGhlckFubnVpdHkgPSAnb3RoZXIgYW5udWl0eScsXG4gICAgT3ZlcmRyYWZ0ID0gJ292ZXJkcmFmdCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBQZW5zaW9uID0gJ3BlbnNpb24nLFxuICAgIFByZXBhaWQgPSAncHJlcGFpZCcsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZHNwID0gJ3Jkc3AnLFxuICAgIFJlc3AgPSAncmVzcCcsXG4gICAgUmV0aXJlbWVudCA9ICdyZXRpcmVtZW50JyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScmlmID0gJ3JyaWYnLFxuICAgIFJyc3AgPSAncnJzcCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgU2F2aW5ncyA9ICdzYXZpbmdzJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFN0dWRlbnQgPSAnc3R1ZGVudCcsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5J1xufVxuXG4vKipcbiAqIGBpbnZlc3RtZW50OmAgSW52ZXN0bWVudCBhY2NvdW50LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyB0eXBlIGlzIGNhbGxlZCBgYnJva2VyYWdlYCBpbnN0ZWFkLiAgYGNyZWRpdDpgIENyZWRpdCBjYXJkICBgZGVwb3NpdG9yeTpgIERlcG9zaXRvcnkgYWNjb3VudCAgYGxvYW46YCBMb2FuIGFjY291bnQgIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRUeXBlIHtcbiAgICBJbnZlc3RtZW50ID0gJ2ludmVzdG1lbnQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBmcm9tIHBlcmZvcm1pbmcgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGZvciB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgbmV0d29ya19zdGF0dXM6IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJuc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgcHJldmlvdXNfcmV0dXJucz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzQWNjb3VudE51bWJlckZvcm1hdH1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfZm9ybWF0OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0O1xufVxuLyoqXG4gKiBJbmRpY2F0b3Igb2YgYWNjb3VudCBudW1iZXIgZm9ybWF0IHZhbGlkaXR5IGZvciBpbnN0aXR1dGlvbi4gIGB2YWxpZGA6IGluZGljYXRlcyB0aGF0IHRoZSBhY2NvdW50IG51bWJlciBoYXMgYSBjb3JyZWN0IGZvcm1hdCBmb3IgdGhlIGluc3RpdHV0aW9uLiAgYGludmFsaWRgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgYWNjb3VudCBudW1iZXIgaGFzIGFuIGluY29ycmVjdCBmb3JtYXQgZm9yIHRoZSBpbnN0aXR1dGlvbi4gIGB1bmtub3duYDogaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvcm1hdCBpcyBjb3JyZWN0IGZvciB0aGUgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0IHtcbiAgICBWYWxpZCA9ICd2YWxpZCcsXG4gICAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbi8qKlxuICogU3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciBpbiB0aGUgUGxhaWQgbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBhY2NvdW50IGZvciB0aGUgQUNIIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzXG4gICAgICovXG4gICAgaGFzX251bWJlcnNfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBhY2NvdW50IGZvciB0aGUgQUNIIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyIGlzIGFscmVhZHkgdmVyaWZpZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXNcbiAgICAgKi9cbiAgICBpc19udW1iZXJzX21hdGNoX3ZlcmlmaWVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBrbm93biBBQ0ggcmV0dXJucyBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgaW5jbHVkZSBhIGtub3duIGFkbWluaXN0cmF0aXZlIEFDSCByZXR1cm4gZm9yIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAgICAgKi9cbiAgICBoYXNfcHJldmlvdXNfYWRtaW5pc3RyYXRpdmVfcmV0dXJuOiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2RldGFpbHM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCAqYW5kKiBvbmUgb3IgbW9yZSBhY2NvdW50IHR5cGVzIGJlaW5nIHJlcXVlc3RlZCBpcyBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgKHN1Y2ggYXMgYSBjcmVkaXQgY2FyZCkgYXMgQ2FwaXRhbCBPbmUgZG9lcyBub3QgcHJvdmlkZSByZWFsLXRpbWUgYmFsYW5jZSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIEluIHRoaXMgY2FzZSwgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCBhcyB3ZWxsIGFzIGZvciBkZXBvc2l0b3J5IGFjY291bnRzIGF0IENhcGl0YWwgT25lIChpbmNsdWRpbmcgYWxsIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzKSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQgYW5kIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uIHdpbGwgYmUgZmV0Y2hlZC4gIElmIHRoaXMgZmllbGQgaXMgbm90IGlnbm9yZWQsIGFuZCBubyBhY2NlcHRhYmxlIGJhbGFuY2UgaXMgYXZhaWxhYmxlLCBhbiBgSU5WQUxJRF9SRVNVTFRgIGVycm9yIHdpdGggdGhlIGNvZGUgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUbyBlbmFibGUgQmFsYW5jZSBQbHVzIChiZXRhKSwgc2VuZCB0aGlzIG9iamVjdCBhcyBwYXJ0IG9mIHRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXF1ZXN0LiBPbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgcGFydGljaXBhdGluZyBpbiB0aGUgQmFsYW5jZSBQbHVzIGJldGEgcHJvZ3JhbTsgdG8gZW5yb2xsIGluIHRoZSBiZXRhLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBJZiB0aGlzIG9iamVjdCBpcyBwcmVzZW50IGluIHRoZSByZXF1ZXN0LCB0aGUgW2BwYXltZW50X3Jpc2tfYXNzZXNzbWVudGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS9iYWxhbmNlLXBsdXMvI2FjY291bnRzLWJhbGFuY2UtZ2V0LXJlc3BvbnNlLXBheW1lbnQtcmlzay1hc3Nlc3NtZW50LXJpc2stbGV2ZWwpIG9iamVjdCB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgdGhhdCBpcyB0aGUgZnVuZGluZyBzb3VyY2UgZm9yIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbi4gVGhlIGBhY2NvdW50X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGFzIHdlbGwgYXMgdGhlIFtgb25TdWNjZXNzYF0oL2RvY3MvbGluay9pb3MvI2xpbmstaW9zLW9uc3VjY2Vzcy1saW5rU3VjY2Vzcy1tZXRhZGF0YS1hY2NvdW50cy1pZCkgY2FsbGJhY2sgbWV0YWRhdGEuICBUaGlzIHdpbGwgcmV0dXJuIGFuIFtgSU5WQUxJRF9BQ0NPVU5UX0lEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBgYW1vdW50YCBtdWx0aXBsaWVkIGJ5IHRoZSBgYmFsYW5jZV90aHJlc2hvbGRfcGVyY2VudGFnZWAgKGFzIGEgcGVyY2VudGFnZSkgZXhjZWVkcyB0aGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCwgdGhlbiBbYHBheW1lbnRfcmlza19hc3Nlc3NtZW50LmV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNhY2NvdW50cy1iYWxhbmNlLWdldC1yZXNwb25zZS1wYXltZW50LXJpc2stYXNzZXNzbWVudC1leGNlZWRzLWJhbGFuY2UtdGhyZXNob2xkKSBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZmFsc2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYGFtb3VudGAgaXMgMjAwIGFuZCB0aGUgYGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2VgIGlzIDkwLCB0aGVuIHRoZSBhY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBhdCBsZWFzdCAxODAgZm9yIGBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkYCB0byBiZSBmYWxzZS4gICBCeSBkZWZhdWx0LCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugd2lsbCBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uOyBpZiBpdCBjYW5ub3QgYmUgb2J0YWluZWQsIHRoZSBjdXJyZW50IGJhbGFuY2Ugd2lsbCBiZSB1c2VkLiAgIFRoaXMgZmllbGQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tZXJzIHVzaW5nIGluZGlyZWN0IEl0ZW1zIGFuZCB3aG8gZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byByYXcgYmFsYW5jZSBkYXRhLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2U/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBiYWxhbmNlIGhhcyB0byBiZSByZWZyZXNoZWQgaW4gcmVhbCB0aW1lIGFzIHBhcnQgb2YgdGhlIEFQSSBjYWxsIHdoZW4gdXNpbmcgQmFsYW5jZSBQbHVzLiBTZXR0aW5nIHRoaXMgdG8gZmllbGQgdG8gYHRydWVgIHdpbGwgcmVzdWx0IGluIG1vcmUgcmVjZW50IGJhbGFuY2VzLCBidXQgbGF0ZW5jeSBtYXkgYmUgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlLiBJZiBtYWtpbmcgYSByZWd1bGFyIChub24tQmFsYW5jZSBQbHVzKSBCYWxhbmNlIGNhbGwsIHdpdGhvdXQgdGhlIGBwYXltZW50X2RldGFpbHNgIG9iamVjdCBwcmVzZW50LCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3aWxsIGFsd2F5cyByZXR1cm4gcmVhbC10aW1lIGJhbGFuY2VzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICByZXF1aXJlc19yZWFsX3RpbWVfYmFsYW5jZV9yZWZyZXNoPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvdmlkZXMgYSBkZXRhaWxlZCByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24uIEZvciB0aGlzIGZpZWxkIHRvIGJlIHJldHVybmVkLCB0aGUgY2xpZW50IG11c3QgYmUgZW5yb2xsZWQgaW4gdGhlIEJhbGFuY2UgUGx1cyBiZXRhIHByb2dyYW0gYW5kIHRoZSBbYHBheW1lbnRfZGV0YWlsc2BdKGh0dHA6Ly9wbGFpZC5jb20vZG9jcy9iYWxhbmNlL2JhbGFuY2UtcGx1cy8jYWNjb3VudHMtYmFsYW5jZS1nZXQtcmVxdWVzdC1wYXltZW50LWRldGFpbHMpIG9iamVjdCBtdXN0IGhhdmUgYmVlbiBzZW50IGluIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFsYW5jZVBsdXNSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgcmlza19sZXZlbDogQmFsYW5jZVBsdXNSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbGFuY2VQbHVzQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzOiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogQSByaXNrIHNjb3JlIHJhbmdpbmcgZnJvbSAxLTk5LCByZWZsZWN0aW5nIHRoZSBsaWtlbGlob29kIG9mIEFDSCBkZWJpdCByZXR1cm4uIEEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyBhIGdyZWF0ZXIgcmlzayBvZiByZXR1cm4sIG9mdGVuIGR1ZSB0byBvdmVyZHJhd24gYWNjb3VudHMgb3IgYWNjb3VudCBpbmVsaWdpYmlsaXR5IHRvIHJlY2VpdmUgQUNIIHRyYW5zYWN0aW9ucy4gVHlwaWNhbCByZXR1cm4gY29kZXMgaW5jbHVkZSBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLCBldGMuLCB3aXRoIGEgdHVybmFyb3VuZCBvZiAyIGJhbmtpbmcgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBiYWxhbmNlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgYmFsYW5jZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHJlYXNvbiBjb250cmlidXRpbmcgdG8gdGhlIHJpc2sgYXNzZXNzbWVudCBvZiBhbiBBQ0ggdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBzdXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIGNsYXNzaWZpZWQgYXMgYEhJR0hgLCBgTUVESVVNLUhJR0hgLCBvciBgTUVESVVNYCByaXNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrUmVhc29uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICByaXNrX3JlYXNvbnM/OiBBcnJheTxSaXNrUmVhc29uPjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBleGNlZWRzIHRoZSBiYWxhbmNlIHRocmVzaG9sZCBzZXQgaW4gdGhlIHJlcXVlc3QuIGB0cnVlYCBpbmRpY2F0ZXMgaGlnaGVyIHJpc2s7IGBmYWxzZWAgaW5kaWNhdGVzIGxvd2VyIHJpc2suIElmIHRoZSBgYW1vdW50YCBtdWx0aXBsaWVkIGJ5IHRoZSBgYmFsYW5jZV90aHJlc2hvbGRfcGVyY2VudGFnZWAgKGFzIGEgcGVyY2VudGFnZSkgZXhjZWVkcyB0aGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCwgdGhlbiBgZXhjZWVkc19iYWxhbmNlX3RocmVzaG9sZGAgd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZmFsc2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYGFtb3VudGAgaXMgMjAwIGFuZCB0aGUgYGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2VgIGlzIDkwLCB0aGVuIHRoZSBhY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBhdCBsZWFzdCAxODAgZm9yIGBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkYCB0byBiZSBmYWxzZS4gICBCeSBkZWZhdWx0LCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugd2lsbCBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uOyBpZiBpdCBjYW5ub3QgYmUgb2J0YWluZWQsIHRoZSBjdXJyZW50IGJhbGFuY2Ugd2lsbCBiZSB1c2VkLiAgIFRoaXMgZmllbGQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tZXJzIHVzaW5nIGluZGlyZWN0IEl0ZW1zIGFuZCB3aG8gZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byByYXcgYmFsYW5jZSBkYXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIGV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGQ6IGJvb2xlYW47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGAgYW5kIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSWYgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgd2FzIGNhbGxlZCwgZWFjaCBhY2NvdW50IHdpbGwgaW5jbHVkZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrX2Fzc2Vzc21lbnQ/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aW9uL2FjdGl2aXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWN0aW9uU3RhdGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQXR0ZW1wdCA9ICdBVFRFTVBUJyxcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRScsXG4gICAgU2tpcHBlZCA9ICdTS0lQUEVEJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjdGl2aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpdml0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgYWN0aXZpdHk6IEFjdGl2aXR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGlzIGFjdGl2aXR5IHdhcyBpbml0aWF0ZWQgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpbml0aWF0ZWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY3Rpdml0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcHBsaWNhdGlvbiBJRCBvZiB0aGUgY2xpZW50IHdobyBpbml0aWF0ZWQgdGhlIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjdGlvblN0YXRlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHN0YXRlOiBBY3Rpb25TdGF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgdGFyZ2V0X2FwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBhdXRoZW50aWNhdGlvbj86IEl0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbjtcbn1cbi8qKlxuICogVHlwZXMgb2YgY29uc2VudCBhY3Rpdml0aWVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpdml0eVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgSXRlbUNyZWF0ZSA9ICdJVEVNX0NSRUFURScsXG4gICAgSXRlbUltcG9ydCA9ICdJVEVNX0lNUE9SVCcsXG4gICAgSXRlbVVwZGF0ZSA9ICdJVEVNX1VQREFURScsXG4gICAgSXRlbVVubGluayA9ICdJVEVNX1VOTElOSycsXG4gICAgUG9ydGFsVW5saW5rID0gJ1BPUlRBTF9VTkxJTksnLFxuICAgIFBvcnRhbEl0ZW1zRGVsZXRlID0gJ1BPUlRBTF9JVEVNU19ERUxFVEUnLFxuICAgIEl0ZW1SZW1vdmUgPSAnSVRFTV9SRU1PVkUnLFxuICAgIEludmFyaWFudENoZWNrZXJEZWxldGlvbiA9ICdJTlZBUklBTlRfQ0hFQ0tFUl9ERUxFVElPTicsXG4gICAgU2NvcGVzVXBkYXRlID0gJ1NDT1BFU19VUERBVEUnXG59XG5cbi8qKlxuICogQSBwaHlzaWNhbCBtYWlsaW5nIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTm90UmVxdWlyZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYmVpbmcgdXNlZCBmb3IgY29tbWVyY2lhbCBvciByZXNpZGVudGlhbCBwdXJwb3Nlcy4gIE5vdGU6IFRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAgd2hlbiBQbGFpZCBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3NcXCdzIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFkZHJlc3NQdXJwb3NlTGFiZWwge1xuICAgIFJlc2lkZW50aWFsID0gJ3Jlc2lkZW50aWFsJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBhcHBsaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5IHB1cnBvc2VzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgZ3JhbnRlZCBwcm9kdWN0aW9uIGFjY2VzcyBhdCBQbGFpZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGpvaW5fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgY2xpZW504oCZcyBicm9hZCB1c2UgY2FzZSBhcyBhc3Nlc3NlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHVzZV9jYXNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBjbGllbnTigJlzIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNvbXBhbnlfbGVnYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNpdHkgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlZ2lvbiBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3N0YWwgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFwcGxpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldEhvbGRlck5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXIge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXJzIHtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsdGltZSB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIGBjdXJyZW50YCBpcyBgbnVsbGAgdGhpcyBmaWVsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGFzc2V0cyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IGJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDsgaWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgVHJhbnNhY3Rpb25zLCB0aGUgYmFsYW5jZSB3aWxsIGJlIGF0IGxlYXN0IGFzIHJlY2VudCBhcyB0aGUgbW9zdCByZWNlbnQgVHJhbnNhY3Rpb24gdXBkYXRlLiBJZiB5b3UgcmVxdWlyZSByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGJvcnJvd2VkIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBpbnZlc3RtZW50LXR5cGUgYWNjb3VudHMsIHRoZSBtYXJnaW4gYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYm9ycm93ZWQgYXNzZXRzIGluIHRoZSBhY2NvdW50LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG1hcmdpbiBvciBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIG1hcmdpbl9sb2FuX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRvcl9pZGAgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0b3JfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiBUaGUgYGFzc2V0c2AgcHJvZHVjdCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBsaW5rOyB0aGUgQXNzZXRzIHByb2R1Y3QgY2Fubm90IGJlIGFkZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBJZiB1c2luZyBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eSwgYGRheXNfcmVxdWVzdGVkYCBtdXN0IGJlIGF0IGxlYXN0IDYxIGZvciBuZXcgb3JpZ2luYXRpb25zIG9yIGF0IGxlYXN0IDMxIGZvciByZWZpbmFuY2luZ3MuICBBbiBBc3NldCBSZXBvcnQgcmVxdWVzdGVkIHdpdGggXFxcIkFkZGl0aW9uYWwgSGlzdG9yeVxcXCIgKHRoYXQgaXMsIHdpdGggbW9yZSB0aGFuIDYxIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgd2lsbCBpbmN1ciBhbiBBZGRpdGlvbmFsIEhpc3RvcnkgZmVlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC4gVGhlIG9wdGlvbmFsIGB1c2VyYCBvYmplY3QgaXMgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIEFzc2V0cyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIEFzc2V0IFJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogdHJ1ZSB0byByZXR1cm4gYmFsYW5jZSBhbmQgaWRlbnRpdHkgZWFybGllciBhcyBhIGZhc3QgcmVwb3J0LiBEZWZhdWx0cyB0byBmYWxzZSBpZiBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2Zhc3RfcmVwb3J0PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgYXNzZXQgcmVwb3J0LiBQb3NzaWJsZSB2YWx1ZXM6IGBcXFwiaW52ZXN0bWVudHNcXFwiYFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgQXNzZXQgUmVwb3J0LiBUbyBmZXRjaCBgaW52ZXN0bWVudHNgIGRhdGEgKHRyYW5zYWN0aW9ucywgaG9sZGluZ3MsIGV0Yy4pIGluIHRoZSBBc3NldCBSZXBvcnQsIGBpbnZlc3RtZW50c2AgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYGFkZF9vbnNgLiBGb3IgRmFzdCBBc3NldHMsIGBmYXN0X2Fzc2V0c2AgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYGFkZF9vbnNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEFkZE9ucz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xuICAgIC8qKlxuICAgICAqIElmIHNldCB0byBmYWxzZSwgb25seSAxIGl0ZW0gbXVzdCBiZSBoZWFsdGh5IGF0IHRoZSB0aW1lIG9mIHJlcG9ydCBjcmVhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZSwgd2hpY2ggd291bGQgcmVxdWlyZSBhbGwgaXRlbXMgdG8gYmUgaGVhbHRoeSBhdCB0aGUgdGltZSBvZiByZXBvcnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1aXJlX2FsbF9pdGVtcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGFuIGFzc2V0IHJlcG9ydCBmb3IuIFRoZSBsYXRlc3QgYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB3aWxsIGJlIHJldHVybmVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBmZXRjaCBcXFwiZmFzdFxcXCIgdmVyc2lvbiBvZiBhc3NldCByZXBvcnQuIERlZmF1bHRzIHRvIGZhbHNlIGlmIG9taXR0ZWQuIENhbiBvbmx5IGJlIHVzZWQgaWYgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3YXMgY2FsbGVkIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBmYXN0X3JlcG9ydD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIG9yIGFkZCBkYXRhIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBBc3NldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgaG9sZGluZ3MsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9u4oCZcyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSBmb3IgYnV5IHRyYW5zYWN0aW9uczsgbmVnYXRpdmUgZm9yIHNlbGwgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHZlc3RlZCBob2xkaW5ncyBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHZlc3RlZF92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYW4gQXNzZXQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbeKAmXMgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBc3NldHM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEFzc2V0cz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm5lZCBieSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBNdXN0IGJlIGFuIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYG9wdGlvbnNgIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aWxsIGJlIHVzZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIGFzc2V0IHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgZWl0aGVyIGEgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IGN1cnJlbnQgaWRlbnRpdHkgYW5kIGJhbGFuY2UgaW5mb3JtYXRpb24sIG9yIGEgRnVsbCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgYWxzbyBjb250YWluIGhpc3RvcmljYWwgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgdHJhbnNhY3Rpb24gZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHlwZSB7XG4gICAgRnVsbCA9ICdGVUxMJyxcbiAgICBGYXN0ID0gJ0ZBU1QnXG59XG5cbi8qKlxuICogVGhlIHVzZXIgb2JqZWN0IGFsbG93cyB5b3UgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBBc3NldCBSZXBvcnQuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBUaGUgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYW5kIGBzc25gIGZpZWxkcyBhcmUgcmVxdWlyZWQgaWYgeW91IHdvdWxkIGxpa2UgdGhlIFJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZeKAmXMgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB5b3UgZGV0ZXJtaW5lIGFuZCBzdWJtaXQgZm9yIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZS4gUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIG1pZGRsZV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbGFzdCBuYW1lLiAgUmVxdWlyZWQgZm9yIHRoZSBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGxhc3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIFNvY2lhbCBTZWN1cml0eSBOdW1iZXIuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gIEZvcm1hdDogXFxcImRkZC1kZC1kZGRkXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciwgaW4gRS4xNjQgZm9ybWF0OiAre2NvdW50cnljb2RlfXtudW1iZXJ9LiBGb3IgZXhhbXBsZTogXFxcIisxNDE1MTIzNDU2N1xcXCIuIFBob25lIG51bWJlcnMgcHJvdmlkZWQgaW4gb3RoZXIgZm9ybWF0cyB3aWxsIGJlIHBhcnNlZCBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRVc2VyXG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nLi4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRUcmFuc2FjdGlvbkRldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFVEFJTDogQXNzZXRUcmFuc2FjdGlvbkRldGFpbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVNDUklQVE9OOiBBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+O1xufVxuLyoqXG4gKiBBc3NldCBUcmFuc2FjdGlvbiBDYXRlZ29yeSBUeXBlIEVudW1lcmF0ZWQgZGVyaXZlZCBieSBWZW5kb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlIHtcbiAgICBBdG1GZWUgPSAnQVRNRmVlJyxcbiAgICBBZHZlcnRpc2luZyA9ICdBZHZlcnRpc2luZycsXG4gICAgQWlyVHJhdmVsID0gJ0FpclRyYXZlbCcsXG4gICAgQWxjb2hvbEJhcnMgPSAnQWxjb2hvbEJhcnMnLFxuICAgIEFsbG93YW5jZSA9ICdBbGxvd2FuY2UnLFxuICAgIEFtdXNlbWVudCA9ICdBbXVzZW1lbnQnLFxuICAgIEFydHMgPSAnQXJ0cycsXG4gICAgQXV0b1RyYW5zcG9ydCA9ICdBdXRvVHJhbnNwb3J0JyxcbiAgICBBdXRvSW5zdXJhbmNlID0gJ0F1dG9JbnN1cmFuY2UnLFxuICAgIEF1dG9QYXltZW50ID0gJ0F1dG9QYXltZW50JyxcbiAgICBCYWJ5U3VwcGxpZXMgPSAnQmFieVN1cHBsaWVzJyxcbiAgICBCYWJ5c2l0dGVyRGF5Y2FyZSA9ICdCYWJ5c2l0dGVyRGF5Y2FyZScsXG4gICAgQmFua0ZlZSA9ICdCYW5rRmVlJyxcbiAgICBCaWxsc1V0aWxpdGllcyA9ICdCaWxsc1V0aWxpdGllcycsXG4gICAgQm9udXMgPSAnQm9udXMnLFxuICAgIEJvb2tzU3VwcGxpZXMgPSAnQm9va3NTdXBwbGllcycsXG4gICAgQnVzaW5lc3NTZXJ2aWNlcyA9ICdCdXNpbmVzcyBTZXJ2aWNlcycsXG4gICAgQnV5ID0gJ0J1eScsXG4gICAgQ2FzaEF0bSA9ICdDYXNoQVRNJyxcbiAgICBDaGFyaXR5ID0gJ0NoYXJpdHknLFxuICAgIENoZWNrID0gJ0NoZWNrJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ2hpbGRTdXBwb3J0JyxcbiAgICBDbG90aGluZyA9ICdDbG90aGluZycsXG4gICAgQ29mZmVlU2hvcHMgPSAnQ29mZmVlU2hvcHMnLFxuICAgIENyZWRpdENhcmRQYXltZW50ID0gJ0NyZWRpdENhcmRQYXltZW50JyxcbiAgICBEZW50aXN0ID0gJ0RlbnRpc3QnLFxuICAgIERvY3RvciA9ICdEb2N0b3InLFxuICAgIEVkdWNhdGlvbiA9ICdFZHVjYXRpb24nLFxuICAgIEVsZWN0cm9uaWNzU29mdHdhcmUgPSAnRWxlY3Ryb25pY3NTb2Z0d2FyZScsXG4gICAgRW50ZXJ0YWlubWVudCA9ICdFbnRlcnRhaW5tZW50JyxcbiAgICBFeWVjYXJlID0gJ0V5ZWNhcmUnLFxuICAgIEZhc3RGb29kID0gJ0Zhc3RGb29kJyxcbiAgICBGZWRlcmFsVGF4ID0gJ0ZlZGVyYWxUYXgnLFxuICAgIEZlZXNDaGFyZ2VzID0gJ0ZlZXNDaGFyZ2VzJyxcbiAgICBGaW5hbmNlQ2hhcmdlID0gJ0ZpbmFuY2VDaGFyZ2UnLFxuICAgIEZpbmFuY2lhbCA9ICdGaW5hbmNpYWwnLFxuICAgIEZpbmFuY2lhbEFkdmlzb3IgPSAnRmluYW5jaWFsQWR2aXNvcicsXG4gICAgRm9vZERpbmluZyA9ICdGb29kRGluaW5nJyxcbiAgICBGdXJuaXNoaW5ncyA9ICdGdXJuaXNoaW5ncycsXG4gICAgR2FzRnVlbCA9ICdHYXNGdWVsJyxcbiAgICBHaWZ0c0RvbmF0aW9ucyA9ICdHaWZ0c0RvbmF0aW9ucycsXG4gICAgR3JvY2VyaWVzID0gJ0dyb2NlcmllcycsXG4gICAgR3ltID0gJ0d5bScsXG4gICAgSGFpciA9ICdIYWlyJyxcbiAgICBIZWFsdGhGaXRuZXNzID0gJ0hlYWx0aEZpdG5lc3MnLFxuICAgIEhlYWx0aEluc3VyYW5jZSA9ICdIZWFsdGhJbnN1cmFuY2UnLFxuICAgIEhvYmJpZXMgPSAnSG9iYmllcycsXG4gICAgSG9tZSA9ICdIb21lJyxcbiAgICBIb21lSW1wcm92ZW1lbnQgPSAnSG9tZUltcHJvdmVtZW50JyxcbiAgICBIb21lSW5zdXJhbmNlID0gJ0hvbWVJbnN1cmFuY2UnLFxuICAgIEhvbWVQaG9uZSA9ICdIb21lUGhvbmUnLFxuICAgIEhvbWVTZXJ2aWNlcyA9ICdIb21lU2VydmljZXMnLFxuICAgIEhvbWVTdXBwbGllcyA9ICdIb21lU3VwcGxpZXMnLFxuICAgIEhvdGVsID0gJ0hvdGVsJyxcbiAgICBJbmNvbWUgPSAnSW5jb21lJyxcbiAgICBJbnRlcmVzdEluY29tZSA9ICdJbnRlcmVzdEluY29tZScsXG4gICAgSW50ZXJuZXQgPSAnSW50ZXJuZXQnLFxuICAgIEludmVzdG1lbnRzID0gJ0ludmVzdG1lbnRzJyxcbiAgICBLaWRzID0gJ0tpZHMnLFxuICAgIEtpZHNBY3Rpdml0aWVzID0gJ0tpZHNBY3Rpdml0aWVzJyxcbiAgICBMYXRlRmVlID0gJ0xhdGVGZWUnLFxuICAgIExhdW5kcnkgPSAnTGF1bmRyeScsXG4gICAgTGF3bkdhcmRlbiA9ICdMYXduR2FyZGVuJyxcbiAgICBMZWdhbCA9ICdMZWdhbCcsXG4gICAgTGlmZUluc3VyYW5jZSA9ICdMaWZlSW5zdXJhbmNlJyxcbiAgICBMb2FuSW5zdXJhbmNlID0gJ0xvYW5JbnN1cmFuY2UnLFxuICAgIExvYW5QYXltZW50ID0gJ0xvYW5QYXltZW50JyxcbiAgICBMb2FucyA9ICdMb2FucycsXG4gICAgTW9iaWxlUGhvbmUgPSAnTW9iaWxlUGhvbmUnLFxuICAgIE1vcnRnYWdlUmVudCA9ICdNb3J0Z2FnZVJlbnQnLFxuICAgIE1vdmllc0R2ZHMgPSAnTW92aWVzRFZEcycsXG4gICAgTXVzaWMgPSAnTXVzaWMnLFxuICAgIE5ld3NwYXBlcnNNYWdhemluZXMgPSAnTmV3c3BhcGVyc01hZ2F6aW5lcycsXG4gICAgT2ZmaWNlU3VwcGxpZXMgPSAnT2ZmaWNlU3VwcGxpZXMnLFxuICAgIFBhcmtpbmcgPSAnUGFya2luZycsXG4gICAgUGF5Y2hlY2sgPSAnUGF5Y2hlY2snLFxuICAgIFBlcnNvbmFsQ2FyZSA9ICdQZXJzb25hbENhcmUnLFxuICAgIFBldEZvb2RTdXBwbGllcyA9ICdQZXRGb29kU3VwcGxpZXMnLFxuICAgIFBldEdyb29taW5nID0gJ1BldEdyb29taW5nJyxcbiAgICBQZXRzID0gJ1BldHMnLFxuICAgIFBoYXJtYWN5ID0gJ1BoYXJtYWN5JyxcbiAgICBQcmludGluZyA9ICdQcmludGluZycsXG4gICAgUHJvcGVydHlUYXggPSAnUHJvcGVydHkgVGF4JyxcbiAgICBQdWJsaWNUcmFuc3BvcnRhdGlvbiA9ICdQdWJsaWMgVHJhbnNwb3J0YXRpb24nLFxuICAgIFJlaW1idXJzZW1lbnQgPSAnUmVpbWJ1cnNlbWVudCcsXG4gICAgUmVudGFsQ2FyVGF4aSA9ICdSZW50YWxDYXJUYXhpJyxcbiAgICBSZXN0YXVyYW50cyA9ICdSZXN0YXVyYW50cycsXG4gICAgU2FsZXNUYXggPSAnU2FsZXNUYXgnLFxuICAgIFNlcnZpY2VQYXJ0cyA9ICdTZXJ2aWNlUGFydHMnLFxuICAgIFNlcnZpY2VGZWUgPSAnU2VydmljZUZlZScsXG4gICAgU2hpcHBpbmcgPSAnU2hpcHBpbmcnLFxuICAgIFNob3BwaW5nID0gJ1Nob3BwaW5nJyxcbiAgICBTcGFNYXNzYWdlID0gJ1NwYU1hc3NhZ2UnLFxuICAgIFNwb3J0aW5nR29vZHMgPSAnU3BvcnRpbmdHb29kcycsXG4gICAgU3BvcnRzID0gJ1Nwb3J0cycsXG4gICAgU3RhdGVUYXggPSAnU3RhdGVUYXgnLFxuICAgIFN0dWRlbnRMb2FuID0gJ1N0dWRlbnQgTG9hbicsXG4gICAgVGF4ZXMgPSAnVGF4ZXMnLFxuICAgIFRlbGV2aXNpb24gPSAnVGVsZXZpc2lvbicsXG4gICAgVG95cyA9ICdUb3lzJyxcbiAgICBUcmFuc2ZlciA9ICdUcmFuc2ZlcicsXG4gICAgVHJhdmVsID0gJ1RyYXZlbCcsXG4gICAgVHVpdGlvbiA9ICdUdWl0aW9uJyxcbiAgICBVbmNhdGVnb3JpemVkID0gJ1VuY2F0ZWdvcml6ZWQnLFxuICAgIFV0aWxpdGllcyA9ICdVdGlsaXRpZXMnLFxuICAgIFZhY2F0aW9uID0gJ1ZhY2F0aW9uJyxcbiAgICBWZXRlcmluYXJ5ID0gJ1ZldGVyaW5hcnknXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24ge1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIERlc2NyaXB0aW9uIFN0cmluZyB1cCB0byAzIG9jY3VyYW5jZXMgMSByZXF1aXJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb246IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbCB7XG4gICAgLyoqXG4gICAgICogQSB2ZW5kb3IgY3JlYXRlZCB1bmlxdWUgSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblVuaXF1ZUlkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBBbW91bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25BbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uRGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IFRyYW5zYWN0aW9uIFBvc3QgRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblBvc3REYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblR5cGU6IEFzc2V0VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlIHdpdGggd2hvIGRpZCB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25QYWlkQnlOYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZJIFByb3ZpZGVkIC0gZXhhbXBsZXMgYXJlIGF0bSwgY2FzaCwgY2hlY2ssIGNyZWRpdCwgZGViaXQsIGRlcG9zaXQsIGRpcmVjdERlYml0LCBkaXJlY3REZXBvc2l0LCBkaXZpZGVuZCwgZmVlLCBpbnRlcmVzdCwgb3RoZXIsIHBheW1lbnQsIHBvaW50T2ZTYWxlLCByZXBlYXRQYXltZW50LCBzZXJ2aWNlQ2hhcmdlLCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvblR5cGVBZGRpdGlvbmFsRGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25DYXRlZ29yeVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlOiBBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGSSBwcm92aWRlZCBUcmFuc2FjdGlvbiBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBGaW5hbmNpYWxJbnN0aXR1dGlvblRyYW5zYWN0aW9uSWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gVHlwZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBDcmVkaXQgPSAnQ3JlZGl0JyxcbiAgICBEZWJpdCA9ICdEZWJpdCdcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbj47XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IHNwZWNpZmllcyBmaW5hbmNpYWwgYXNzZXRzIGluIGEgbW9ydGdhZ2UgbG9hbiB0cmFuc2FjdGlvbi4gQXNzZXRzIG1heSBiZSBlaXRoZXIgbGlxdWlkIG9yIGZpeGVkIGFuZCBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBhc3NldCBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFR5cGUge1xuICAgIENoZWNraW5nQWNjb3VudCA9ICdDaGVja2luZ0FjY291bnQnLFxuICAgIFNhdmluZ3NBY2NvdW50ID0gJ1NhdmluZ3NBY2NvdW50JyxcbiAgICBJbnZlc3RtZW50ID0gJ0ludmVzdG1lbnQnLFxuICAgIE1vbmV5TWFya2V0RnVuZCA9ICdNb25leU1hcmtldEZ1bmQnLFxuICAgIE90aGVyID0gJ090aGVyJ1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzXG4gICAgICovXG4gICAgQVNTRVQ6IEFycmF5PEFzc2V0Pjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBBc3NldCBSZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBUaGUgcmVzdWx0aW5nIGBlcnJvcmAgd2lsbCBoYXZlIGFuIGBlcnJvcl90eXBlYCBvZiBgQVNTRVRfUkVQT1JUX0VSUk9SYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVNTRVRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFVzZXIgSUQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIEFzc2V0IFJlcG9ydCBoYXMgYmVlbiBnZW5lcmF0ZWQgYW5kIGAvYXNzZXRfcmVwb3J0L2dldGAgaXMgcmVhZHkgdG8gYmUgY2FsbGVkLiAgSWYgeW91IGF0dGVtcHQgdG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IGJlZm9yZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB5b3XigJlsbCByZWNlaXZlIGEgcmVzcG9uc2Ugd2l0aCB0aGUgSFRUUCBzdGF0dXMgY29kZSA0MDAgYW5kIGEgUGxhaWQgZXJyb3IgY29kZSBvZiBgUFJPRFVDVF9OT1RfUkVBRFlgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBBc3NldCBSZXBvcnQgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHJlcG9ydF90eXBlPzogQXNzZXRSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQbGFpZCB3aWxsIHRyaWdnZXIgYSBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgZm9yIEl0ZW1zIHRoYXQgdW5kZXJnbyBhIGNoYW5nZSBpbiBBdXRoIGRhdGEuIFRoaXMgaXMgZ2VuZXJhbGx5IGNhdXNlZCBieSBkYXRhIHBhcnRuZXJzIG5vdGlmeWluZyBQbGFpZCBvZiBhIGNoYW5nZSBpbiB0aGVpciBhY2NvdW50IG51bWJlcmluZyBzeXN0ZW0gb3IgdG8gdGhlaXIgcm91dGluZyBudW1iZXJzLiBUbyBhdm9pZCByZXR1cm5lZCB0cmFuc2FjdGlvbnMsIGN1c3RvbWVycyB0aGF0IHJlY2VpdmUgYSBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgd2l0aCB0aGUgYGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9hdXRoYCBvYmplY3QgcG9wdWxhdGVkIHNob3VsZCBpbW1lZGlhdGVseSBkaXNjb250aW51ZSBhbGwgdXNhZ2VzIG9mIGV4aXN0aW5nIEF1dGggZGF0YSBmb3IgdGhvc2UgYWNjb3VudHMgYW5kIGNhbGwgYC9hdXRoL2dldGAgb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIHRvIG9idGFpbiB1cGRhdGVkIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBcXCdzIGZvciBhY2NvdW50cyB0aGF0IGNvbnRhaW4gbmV3IGF1dGguXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfbmV3X2F1dGg6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGF1dGggYXR0cmlidXRlcyB0aGF0IGNoYW5nZWQuIGBBQ0NPVU5UX05VTUJFUmAgYW5kIGBST1VUSU5HX05VTUJFUmAgYXJlIHRoZSB0d28gcG90ZW50aWFsIHZhbHVlcyB0aGF0IGNhbiBiZSBmbGFnZ2VkIGFzIHVwZGF0ZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwiQUNDT1VOVF9OVU1CRVJcXFwiXSB9YCBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBBcnJheTxBdXRoVXBkYXRlVHlwZXM+OyB9fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfYXV0aDogeyBba2V5OiBzdHJpbmddOiBBcnJheTxBdXRoVXBkYXRlVHlwZXM+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaWRlbnRpZnlpbmcgbnVtYmVycyB1c2VkIGZvciBtYWtpbmcgZWxlY3Ryb25pYyB0cmFuc2ZlcnMgdG8gYW5kIGZyb20gdGhlIGBhY2NvdW50c2AuIFRoZSBpZGVudGlmeWluZyBudW1iZXIgdHlwZSAoQUNILCBFRlQsIElCQU4sIG9yIEJBQ1MpIHVzZWQgd2lsbCBkZXBlbmQgb24gdGhlIGNvdW50cnkgb2YgdGhlIGFjY291bnQuIEFuIGFjY291bnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBudW1iZXIgdHlwZS4gSWYgYSBwYXJ0aWN1bGFyIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIGlzIG5vdCB1c2VkIGJ5IGFueSBgYWNjb3VudHNgIGZvciB3aGljaCBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCwgdGhlIGFycmF5IGZvciB0aGF0IHR5cGUgd2lsbCBiZSBlbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgQUNIIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNBQ0g+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGFjaDogQXJyYXk8TnVtYmVyc0FDSD47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgRUZUIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNFRlQ+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGVmdDogQXJyYXk8TnVtYmVyc0VGVD47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgSUJBTiBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzSW50ZXJuYXRpb25hbD59XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbDogQXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEJBQ1MgbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0JBQ1M+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M6IEFycmF5PE51bWJlcnNCQUNTPjtcbn1cbi8qKlxuICogQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEF1dGhHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2F1dGgvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50c2AgZm9yIHdoaWNoIG51bWJlcnMgYXJlIGJlaW5nIHJldHJpZXZlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBdXRoR2V0TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogQXV0aEdldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQXV0aCBmZWF0dXJlcyBvZiBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aFN1cHBvcnRlZE1ldGhvZHN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRlZF9tZXRob2RzOiBBdXRoU3VwcG9ydGVkTWV0aG9kcyB8IG51bGw7XG59XG4vKipcbiAqIE1ldGFkYXRhIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHdoaWNoIGF1dGggbWV0aG9kcyBhbiBpbnN0aXR1dGlvbiBzdXBwb3J0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoU3VwcG9ydGVkTWV0aG9kcyB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgYXV0aCBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgaW5zdGFudF9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IG1hdGNoIGlzIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBpbnN0YW50X21hdGNoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBhdXRvbWF0ZWQgbWljcm9kZXBvc2l0cyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGF1dG9tYXRlZF9taWNyb19kZXBvc2l0czogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBtaWNyb2RlcG9zaXRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgaW5zdGFudF9taWNyb19kZXBvc2l0czogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGF1dGggZGF0YSB0aGF0IG1heSBoYXZlIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBdXRoVXBkYXRlVHlwZXMge1xuICAgIEFjY291bnROdW1iZXIgPSAnQUNDT1VOVF9OVU1CRVInLFxuICAgIFJvdXRpbmdOdW1iZXIgPSAnUk9VVElOR19OVU1CRVInXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtIGlzIHZlcmlmaWVkIHZpYSBhdXRvbWF0ZWQgbWljcm8tZGVwb3NpdHMuIFdlIHJlY29tbWVuZCBjb21tdW5pY2F0aW5nIHRvIHlvdXIgdXNlcnMgd2hlbiB0aGlzIGV2ZW50IGlzIHJlY2VpdmVkIHRvIG5vdGlmeSB0aGVtIHRoYXQgdGhlaXIgYWNjb3VudCBpcyB2ZXJpZmllZCBhbmQgcmVhZHkgZm9yIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQVVUT01BVElDQUxMWV9WRVJJRklFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYmhvb2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbn1cbi8qKlxuICogQ29udGFpbnMgYWRkaXRpb25hbCBkYXRhIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXNzZXNzIHRoZSBBQ0ggcmV0dXJuIHJpc2tcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF82MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDcgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19zYXZpbmdzX29yX21vbmV5X21hcmtldF9hY2NvdW50OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGFkZHJlc3NfY2hhbmdlX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBlaXRoZXIgZnJvemVuIG9yIHJlc3RyaWN0ZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9mcm96ZW5fb3JfcmVzdHJpY3RlZDogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgZml2ZS10aWVyIHJpc2sgYXNzZXNzbWVudCBmb3IgdGhlIHRyYW5zYWN0aW9uLCBiYXNlZCBvbiB0aGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIG9mIEFDSCByZXR1cm5zLCBtZWFzdXJlZCBieSB0aGUgaW5jaWRlbnQgcmF0ZS4gICBFYWNoIHRpZXIgY29ycmVzcG9uZHMgdG8gYSBkaXN0cmlidXRpb24gd2l0aCBhIGRpZmZlcmVudCBtZWFuIChhdmVyYWdlKSBwcm9iYWJpbGl0eS4gICBgSElHSGA6IFRoZSBtZWFuIHByb2JhYmlsaXR5IG9mIEFDSCByZXR1cm4gcmlzayBpcyBhYm92ZSA0MCUuIGBNRURJVU1fSElHSGA6IFRoZSBtZWFuIHByb2JhYmlsaXR5IG9mIEFDSCByZXR1cm4gcmlzayBpcyAxNSUtNDAlLiAgYE1FRElVTWA6IFRoZSBtZWFuIHByb2JhYmlsaXR5IG9mIEFDSCByZXR1cm4gcmlzayBpcyA1LTEwJS4gYE1FRElVTV9MT1dgOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgMSUtMiUuIGBMT1dgOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgYmVsb3cgMSUuICAgTm90ZSB0aGF0IHRoZXNlIHRpZXJzIGNvcnJlc3BvbmQgdG8gcHJvYmFiaWxpdHkgKmRpc3RyaWJ1dGlvbnMqIGFuZCBub3QgdG8gZGlzY3JldGUgcHJvYmFiaWxpdGllcy4gICBUaGVzZSB0aWVyIGRlZmluaXRpb25zIGFyZSBzcGVjaWZpYyB0byBCYWxhbmNlIFBsdXMgYW5kIGRvIG5vdCBhcHBseSB0byByaXNrIHRpZXJzIGdlbmVyYXRlZCBieSBvdGhlciBQbGFpZCBlbmRwb2ludHMuIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFsYW5jZVBsdXNSaXNrTGV2ZWwge1xuICAgIEhpZ2ggPSAnSElHSCcsXG4gICAgTWVkaXVtSGlnaCA9ICdNRURJVU1fSElHSCcsXG4gICAgTWVkaXVtID0gJ01FRElVTScsXG4gICAgTWVkaXVtTG93ID0gJ01FRElVTV9MT1cnLFxuICAgIExvdyA9ICdMT1cnXG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgYmFuayBpbmNvbWUgcmVwb3J0IGdlbmVyYXRpb24gIGBTVUNDRVNTYDogVGhlIGJhbmsgaW5jb21lIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhbmQgY2FuIGJlIHJldHJpZXZlZCB2aWEgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YC4gIGBGQUlMVVJFYDogVGhlIGJhbmsgaW5jb21lIHJlcG9ydCBmYWlsZWQgdG8gYmUgZ2VuZXJhdGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBiYW5rIGluY29tZSByZXBvcnQgaGFzIGZpbmlzaGVkIGdlbmVyYXRpbmcgb3IgZmFpbGVkIHRvIGdlbmVyYXRlLCB0cmlnZ2VyZWQgYnkgY2FsbGluZyBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIGluIENSQSBlbmFibGVkIGNsaWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua0luY29tZUNvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBCYW5rSW5jb21lQ29tcGxldGVSZXN1bHQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlZnJlc2ggcmVwb3J0IGdlbmVyYXRpb24gIGBTVUNDRVNTYDogVGhlIHJlZnJlc2hlZCByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSByZWZyZXNoZWQgcmVwb3J0IGZhaWxlZCB0byBiZSBnZW5lcmF0ZWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSByZWZyZXNoZWQgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuIFRvIGdldCB0aGlzIHdlYmhvb2ssIHN1YnNjcmliZSB2aWEgdGhlIFtEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9kZXZlbG9wZXJzL3dlYmhvb2tzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX0lOQ09NRV9SRUZSRVNIX0NPTVBMRVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIGNoYW5nZSB0byB0aGUgdXNlclxcJ3MgaW5jb21lIGlzIGRldGVjdGVkLiBZb3Ugc2hvdWxkIGNhbGwgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgdG8gZ2V0IHVwZGF0ZWQgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLiBUbyByZWNlaXZlIHRoaXMgd2ViaG9vaywgc3Vic2NyaWJlIGluIHRoZSBbRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vZGV2ZWxvcGVycy93ZWJob29rcykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1c2VyIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbnMgYSByaXNrIHNjb3JlIGFuZCBhIHJpc2sgdGllciB0aGF0IGV2YWx1YXRlIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzayBiZWNhdXNlIGFuIGFjY291bnQgaXMgb3ZlcmRyYXduIG9yIGJlY2F1c2UgYW4gaW5lbGlnaWJsZSBhY2NvdW50IGlzIHVzZWQuIENvbW1vbiByZXR1cm4gY29kZXMgaW4gdGhpcyBjYXRlZ29yeSBpbmNsdWRlOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCAgXFxcIlIwOVxcXCIsIFxcXCJSMTNcXFwiLCBcXFwiUjE2XFxcIiwgXFxcIlIxN1xcXCIsIFxcXCJSMjBcXFwiLCBcXFwiUjIzXFxcIi4gVGhlc2UgcmV0dXJucyBoYXZlIGEgdHVybmFyb3VuZCB0aW1lIG9mIDIgYmFua2luZyBkYXlzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlza1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluIHRoZSBgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGVpZ2h0IHJpc2sgdGllcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc2NvcmVzOiAgIDE6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAlIC0gMC41JSAgIDI6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjUlIC0gMS41JSAgIDM6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxLjUlIC0gMyUgICA0OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMyUgLSA1JSAgIDU6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiA1JSAtIDEwJSAgIDY6IFByZWRpY3RlZCBiYW5rLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAxMCUgLSAxNSUgICA3OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTUlIGFuZCA1MCUgICA4OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGdyZWF0ZXIgdGhhbiA1MCUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAgICAgKi9cbiAgICByaXNrX3RpZXI6IG51bWJlcjtcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhbmsgdHJhbnNmZXIgd2l0aGluIHRoZSBCYW5rIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzczogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdGhhdCBzaG91bGQgYmUgY3JlZGl0ZWQvZGViaXRlZCBmb3IgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGJhbmsgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogQmFua1RyYW5zZmVyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB5b3UgY2FuIHN0aWxsIGNhbmNlbCB0aGlzIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNhbmNlbGxhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogQmFua1RyYW5zZmVyRmFpbHVyZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VzdG9tIHRhZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGluIHRoZSBjcmVhdGUgcmVxdWVzdC4gV2lsbCBiZSBudWxsIGlmIG5vdCBwcm92aWRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2Ugb2YgYSBiYW5rIHRyYW5zZmVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYXZhaWxhYmxlIGJhbGFuY2UgLSB0aGUgc3VtIG9mIGFsbCBzdWNjZXNzZnVsIGRlYml0IHRyYW5zZmVyIGFtb3VudHMgbWludXMgYWxsIGNyZWRpdCB0cmFuc2ZlciBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGFibGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IGZvciB3aGljaCBiYWxhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbGFuY2U6IEJhbmtUcmFuc2ZlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgYmFuayB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYmFuayB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IEJhbmtUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCDigJMgc2hvdWxkIGJlIHNldCB0byBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNmZXIgZGVzY3JpcHRpb24uIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogQW4gYXJiaXRyYXJ5IHN0cmluZyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGZvciBzdG9yYWdlIHdpdGggdGhlIGJhbmsgdHJhbnNmZXIuIE1heSBiZSB1cCB0byAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tX3RhZz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBvcmlnaW5hdGlvbiBhY2NvdW50LCB0aGlzIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLiBPdGhlcndpc2UsIHRoaXMgZmllbGQgc2hvdWxkIGJlIGxlZnQgYmxhbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyOiBgb3V0Ym91bmRgIGZvciBBUEktaW5pdGlhdGVkIHRyYW5zZmVycywgb3IgYGluYm91bmRgIGZvciBwYXltZW50cyByZWNlaXZlZCBieSB0aGUgRkJPIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJEaXJlY3Rpb24ge1xuICAgIE91dGJvdW5kID0gJ291dGJvdW5kJyxcbiAgICBJbmJvdW5kID0gJ2luYm91bmQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGV2ZW50IGluIHRoZSBCYW5rIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBldmVudCBvY2N1cnJlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IEJhbmtUcmFuc2ZlckV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgdGhpcyBiYWxhbmNlIGJlbG9uZ3MgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfdHlwZTogQmFua1RyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFuayB0cmFuc2ZlciBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgYmFuayB0cmFuc2ZlciBhbW91bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZGlyZWN0aW9uOiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBiYW5rIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgZWl0aGVyIGBkZWJpdGAgb3IgYGNyZWRpdGAuICBBIGBkZWJpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgaW50byB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyOiBgb3V0Ym91bmRgOiBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMgYGluYm91bmRgOiBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHtcbiAgICBJbmJvdW5kID0gJ2luYm91bmQnLFxuICAgIE91dGJvdW5kID0gJ291dGJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdEJhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU/OiBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlcz86IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZzZXQgaW50byB0aGUgbGlzdCBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGJhbmsgdHJhbnNmZXIgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0RGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgKGxhcmdlc3QpIGBldmVudF9pZGAgZmV0Y2hlZCB2aWEgdGhlIHN5bmMgZW5kcG9pbnQsIG9yIDAgaW5pdGlhbGx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBhZnRlcl9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2V2ZW50czogQXJyYXk8QmFua1RyYW5zZmVyRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIGJhbmsgdHJhbnNmZXIgcmVwcmVzZW50cy4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuICBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHJldmVyc2VkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldmVyc2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRXZlbnRUeXBlIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFJldmVyc2VkID0gJ3JldmVyc2VkJ1xufVxuXG4vKipcbiAqIFRoZSBmYWlsdXJlIHJlYXNvbiBpZiB0aGUgdHlwZSBvZiB0aGlzIHRyYW5zZmVyIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXZlcnNlZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRmFpbHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHN0YXR1cyBpcyBgcmV2ZXJzZWRgLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtCYW5rIFRyYW5zZmVycyBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL2JhbmstdHJhbnNmZXJzLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIGJhbmsgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHRyYW5zZmVycyB0byBza2lwIGJlZm9yZSByZXR1cm5pbmcgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgYmFuayB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSBvcmlnaW5hdGVkIHRocm91Z2ggdGhlIHNwZWNpZmllZCBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXJlY3Rpb24/OiBCYW5rVHJhbnNmZXJEaXJlY3Rpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyczogQXJyYXk8QmFua1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gVmFsaWQgb3B0aW9ucyBhcmUgYGFjaGAsIGBzYW1lLWRheS1hY2hgLCBvciBgd2lyZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgV2lyZSA9ICd3aXJlJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldmVyc2VkID0gJ3JldmVyc2VkJ1xufVxuXG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwIGRlc2NyaWJlcyBhIHN3ZWVwIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIG9mIHRoZSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBCYW5rVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgbXVsdGlwbGUgb3JpZ2luYXRpb24gYWNjb3VudHMgYXJlIGF2YWlsYWJsZSwgYG9yaWdpbmF0aW9uX2FjY291bnRfaWRgIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHRoYXQgdGhlIHN3ZWVwcyBiZWxvbmcgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwczogQXJyYXk8QmFua1RyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGZ1bGwgbGVnYWwgbmFtZS4gSWYgdGhlIHRyYW5zZmVyIGBhY2hfY2xhc3NgIGlzIGBjY2RgLCB0aGlzIHNob3VsZCBiZSB0aGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyVXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXLigJlzIGVtYWlsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBob2xkZXJcXCdzIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpbiByZXNwb25zZSBkYXRhLiBEbyBub3QgcHJvdmlkZSB0aGlzIGZpZWxkIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgYmFuayB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IEFDSCBldmVudHMgYXJlIGF2YWlsYWJsZS4gVG8gYmVnaW4gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IG11c3QgZmlyc3QgcmVnaXN0ZXIgeW91ciB3ZWJob29rIGxpc3RlbmVyIGVuZHBvaW50IHZpYSB0aGUgW3dlYmhvb2tzIHBhZ2UgaW4gdGhlIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vd2ViaG9va3MpLiBUaGUgYEJBTktfVFJBTlNGRVJTX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgY2FuIGJlIHVzZWQgdG8gdHJhY2sgdGhlIHByb2dyZXNzIG9mIEFDSCB0cmFuc2ZlcnMgdXNlZCBpbiBbbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb25dKC9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLiBSZWNlaXZpbmcgdGhpcyB3ZWJob29rIGluZGljYXRlcyB5b3Ugc2hvdWxkIGZldGNoIHRoZSBuZXcgZXZlbnRzIGZyb20gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgLiBOb3RlIHRoYXQgW1RyYW5zZmVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSBjdXN0b21lcnMgc2hvdWxkIHVzZSBUcmFuc2ZlciB3ZWJob29rcyBpbnN0ZWFkIG9mIHVzaW5nIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYDsgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50cyBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aCB7XG4gICAgLyoqXG4gICAgICogYEJBTktfVFJBTlNGRVJTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rRm9yQXV0aFxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQmFzZSBSZXBvcnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGlzIElEIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICByZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBCYXNlIFJlcG9ydCB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBDbGllbnQtZ2VuZXJhdGVkIGlkZW50aWZpZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGxlbmRlcnMgdG8gdHJhY2sgbG9hbiBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgUGxhaWQgYWJvdXQgZWFjaCBvZiB0aGUgSXRlbXMgaW5jbHVkZWQgaW4gdGhlIEJhc2UgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SXRlbT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8QmFzZVJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBCYXNlIFJlcG9ydCBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Jhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXN9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYmFsYW5jZXM6IEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXM7XG4gICAgLyoqXG4gICAgICogVGhlIGluZm9ybWF0aW9uIGFib3V0IHByZXZpb3VzbHkgc3VibWl0dGVkIHZhbGlkIGRpc3B1dGUgc3RhdGVtZW50cyBieSB0aGUgY29uc3VtZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q29uc3VtZXJEaXNwdXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBjb25zdW1lcl9kaXNwdXRlczogQXJyYXk8Q29uc3VtZXJEaXNwdXRlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IGF2YWlsYWJsZSB3aXRoaW4gdGhpcyByZXBvcnQgZm9yIHRoaXMgSXRlbSwgdHlwaWNhbGx5IGRlZmluZWQgYXMgdGhlIHRpbWUgc2luY2UgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHRyYW5zYWN0aW9uIGluIHRoYXQgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBCYXNlIFJlcG9ydCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9uIGhpc3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cy4gVHJhbnNhY3Rpb24gaGlzdG9yeSByZXR1cm5lZCBieSBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgdG9wLWxldmVsIGB0cmFuc2FjdGlvbnNgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIERhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lciBvciBvd25lcnMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZTogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cyBhbmQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgYGJyb2tlcmFnZWAgb3IgYGludmVzdG1lbnRgIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM/OiBBcnJheTxCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaW5zaWdodHM/OiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogQmFzZVJlcG9ydEF0dHJpYnV0ZXM7XG59XG4vKipcbiAqIEJhc2UgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBvZiBlYWNoIGNhbGVuZGFyIG1vbnRoXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgaW5zaWdodHMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbW9zdF9yZWNlbnRfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgZGF5cyBhdmFpbGFibGUgaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkOyB1c2UgYGxvbmdlc3RfZ2Fwc19iZXR3ZWVuX3RyYW5zYWN0aW9uc2AgaW5zdGVhZC4gTG9uZ2VzdCBnYXAgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbG9uZ2VzdF9nYXBfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBDdXN0b21lcnMgbXVzdCB0cmFuc2l0aW9uIGZyb20gYGxvbmdlc3RfZ2FwX2JldHdlZW5fdHJhbnNhY3Rpb25zYCBieSBKYW51YXJ5IDMxc3QgMjAyNS4gTG9uZ2VzdCBnYXAgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IGNhbiBpbmNsdWRlIG11bHRpcGxlIHRpbWUgcGVyaW9kcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBsb25nZXN0X2dhcHNfYmV0d2Vlbl90cmFuc2FjdGlvbnM/OiBBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlYml0cyBpbnRvIHRoZSBhY2NvdW50LiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9pbmZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZDsgdXNlIGBhdmVyYWdlX2luZmxvd19hbW91bnRzYCBpbnN0ZWFkLiBBdmVyYWdlIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYXZlcmFnZV9pbmZsb3dfYW1vdW50PzogQXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIEN1c3RvbWVycyBtdXN0IHRyYW5zaXRpb24gZnJvbSBgYXZlcmFnZV9pbmZsb3dfYW1vdW50YCBieSBKYW51YXJ5IDMxc3QgMjAyNS4gQXZlcmFnZSBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gYSB0aW1lIHBlcmlvZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfaW5mbG93X2Ftb3VudHM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBvdXRmbG93cyBmcm9tIHRoZSBhY2NvdW50LiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG51bWJlcl9vZl9vdXRmbG93cz86IEFycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQ7IHVzZSBgYXZlcmFnZV9vdXRmbG93X2Ftb3VudHNgIGluc3RlYWQuIEF2ZXJhZ2UgYW1vdW50IG9mIHRyYW5zYWN0aW9ucyBvdXQgb2YgdGhlIGFjY291bnQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGF2ZXJhZ2Vfb3V0Zmxvd19hbW91bnQ/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogQ3VzdG9tZXJzIG11c3QgdHJhbnNpdGlvbiBmcm9tIGBhdmVyYWdlX291dGZsb3dfYW1vdW50YCBieSBKYW51YXJ5IDMxc3QgMjAyNS4gQXZlcmFnZSBhbW91bnQgb2YgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgYWNjb3VudCBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9vdXRmbG93X2Ftb3VudHM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBubyB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2RheXNfbm9fdHJhbnNhY3Rpb25zPzogbnVtYmVyO1xufVxuLyoqXG4gKiBCYXNlIFJlcG9ydCBtZXRhZGF0YSBhYm91dCB0aGUgZXh0cmFjdGVkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZXh0cmFjdGVkIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlZCBhdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSB0cmFuc2FjdGlvbi1sZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIE5TRiBhbmQgb3ZlcmRyYWZ0IGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHRpbWUgcmFuZ2UgZm9yIHRoZSByZXBvcnQgaW4gdGhlIGdpdmVuIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIE5TRiBhbmQgb3ZlcmRyYWZ0IGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cyBmb3IgYSBnaXZlbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgTlNGIGFuZCBvdmVyZHJhZnQgZmVlIHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCA2MCBkYXlzIGZvciBhIGdpdmVuIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBOU0YgYW5kIG92ZXJkcmFmdCBmZWUgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDkwIGRheXMgZm9yIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBQcmVkaWN0aW9uIGluZGljYXRvciBvZiB3aGV0aGVyIHRoZSBhY2NvdW50IGlzIGEgcHJpbWFyeSBhY2NvdW50LiBPbmx5IG9uZSBhY2NvdW50IHBlciBhY2NvdW50IHR5cGUgYWNyb3NzIHRoZSBpdGVtcyBjb25uZWN0ZWQgd2lsbCBoYXZlIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19wcmltYXJ5X2FjY291bnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSByYW5naW5nIGZyb20gMC0xLiBUaGUgaGlnaGVyIHRoZSBzY29yZSwgdGhlIG1vcmUgY29uZmlkZW50IHdlIGFyZSBvZiB0aGUgYWNjb3VudCBiZWluZyB0aGUgcHJpbWFyeSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpbWFyeV9hY2NvdW50X3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudD86IFRvdGFsSW5mbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnQzMGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF8zMGQ/OiBUb3RhbEluZmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsSW5mbG93QW1vdW50NjBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfNjBkPzogVG90YWxJbmZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbEluZmxvd0Ftb3VudDkwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzkwZD86IFRvdGFsSW5mbG93QW1vdW50OTBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50PzogVG90YWxPdXRmbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50MzBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzMwZD86IFRvdGFsT3V0Zmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsT3V0Zmxvd0Ftb3VudDYwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF82MGQ/OiBUb3RhbE91dGZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbE91dGZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfOTBkPzogVG90YWxPdXRmbG93QW1vdW50OTBkIHwgbnVsbDtcbn1cbi8qKlxuICogQXZlcmFnZSBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBvciBkZWJpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEF2ZXJhZ2UgYmFsYW5jZSBpbiBkb2xsYXIgYW1vdW50IHBlciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U6IENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeTtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYSBCYXNlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJhc2VSZXBvcnRBY2NvdW50Pjtcbn1cbi8qKlxuICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIHBlciBjYWxlbmRhciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExhcmdlc3QgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5cz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBudW1iZXIgb2YgY3JlZGl0cyBvciBkZWJpdHMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjcmVkaXRzIG9yIGRlYml0cyBvdXQgb2YgdGhlIGFjY291bnQgZm9yIHRoaXMgdGltZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGNvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgdHJhbnNhY3Rpb24gdG9vayBwbGFjZSwgaW4gSVMwIDg2MDEgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogQmFzZVJlcG9ydFRyYW5zYWN0aW9uVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhIEJhc2UgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQmFzZSBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0V2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFTRV9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0V2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBCYXNlUmVwb3J0V2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuIGBVU0VSX0ZSQVVEX0FMRVJUYCBpbmRpY2F0ZXMgdGhhdCB0aGUgVXNlciBoYXMgcGxhY2VkIGEgZnJhdWQgYWxlcnQgb24gdGhlaXIgUGxhaWQgQ2hlY2sgY29uc3VtZXIgcmVwb3J0IGR1ZSB0byBzdXNwZWN0ZWQgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYXNlUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIE93bmVyc1VuYXZhaWxhYmxlID0gJ09XTkVSU19VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJyxcbiAgICBVc2VyRnJhdWRBbGVydCA9ICdVU0VSX0ZSQVVEX0FMRVJUJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBUaGUgcmVzdWx0aW5nIGBlcnJvcmAgd2lsbCBoYXZlIGFuIGBlcnJvcl90eXBlYCBvZiBgQkFTRV9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkFTRV9SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvYmplY3QgY29udGFpbnMgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyBhY2NvdW50IHJpc2suIEV4YW1wbGVzIG9mIGRhdGEgaW5jbHVkZTogYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IFNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB0aGUgY29uc3VtZXIsIG9yIGlzIGF0IHJpc2sgb2YgYmVpbmcgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBpdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBhdmFpbGFibGUgdG8gUGxhaWQgZm9yIHRoaXMgYWNjb3VudC4gVGhpcyBtZWFzdXJlLCBjb21iaW5lZCB3aXRoIFBsYWlkIGNvbm5lY3Rpb24gaGlzdG9yeSwgY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIGFnZSBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3Rfb2JzZXJ2ZWRfdHJhbnNhY3Rpb246IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgaW4gdGhlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzcG9uc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlcztcbn1cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgYWNjb3VudCByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6IGBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb25gOiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWQgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5cyBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgYHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50YDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBTYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIG9yIHRoZSBjb25zdW1lciwgb3IgaXMgYXQgcmlzayBvZiBiZWluZyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9jbG9zZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXZhaWxhYmxlIHRvIFBsYWlkIGZvciB0aGlzIGFjY291bnQuIFRoaXMgbWVhc3VyZSwgY29tYmluZWQgd2l0aCBQbGFpZCBjb25uZWN0aW9uIGhpc3RvcnksIGNhbiBiZSB1c2VkIHRvIGluZmVyIHRoZSBhZ2Ugb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X29ic2VydmVkX3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB5b3Ugd2FudCB0byBldmFsdWF0ZSByaXNrLiBgT05CT0FSRElOR2A6IHVzZXIgbGlua3MgYSBmaXJzdCBiYW5rIGFjY291bnQgYXMgcGFydCBvZiB0aGUgb25ib2FyZGluZyBmbG93IG9mIHlvdXIgcGxhdGZvcm0uIGBORVdfQUNDT1VOVGA6IHVzZXIgbGlua3MgYW5vdGhlciBiYW5rIGFjY291bnQgb3IgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBsaW5rZWQgYmFuayBhY2NvdW50IG9uIHlvdXIgcGxhdGZvcm0uIGBJTkZPUk1BVElPTl9DSEFOR0VgOiB1c2VyIGNoYW5nZXMgdGhlaXIgaW5mb3JtYXRpb24gb24geW91ciBwbGF0Zm9ybSwgZS5nLiwgdXBkYXRpbmcgdGhlaXIgcGhvbmUgbnVtYmVyLiBgRE9STUFOVF9VU0VSYDogIHlvdSBkZWNpZGUgdG8gcmUtZXZhbHVhdGUgYSB1c2VyIHRoYXQgYmVjb21lcyBhY3RpdmUgYWZ0ZXIgYSBwZXJpb2Qgb2YgaW5hY3Rpdml0eS4gICBgT1RIRVJgOiBhbnkgb3RoZXIgcmVhc29ucyBub3QgbGlzdGVkIGhlcmUgUG9zc2libGUgdmFsdWVzOiAgYE9OQk9BUkRJTkdgLCBgTkVXX0FDQ09VTlRgLCBgSU5GT1JNQVRJT05fQ0hBTkdFYCwgYERPUk1BTlRfVVNFUmAsIGBPVEhFUmAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlRXZhbHVhdGlvblJlYXNvbiB7XG4gICAgT25ib2FyZGluZyA9ICdPTkJPQVJESU5HJyxcbiAgICBOZXdBY2NvdW50ID0gJ05FV19BQ0NPVU5UJyxcbiAgICBJbmZvcm1hdGlvbkNoYW5nZSA9ICdJTkZPUk1BVElPTl9DSEFOR0UnLFxuICAgIERvcm1hbnRVc2VyID0gJ0RPUk1BTlRfVVNFUicsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdjEvYmVhY29uL2FjY291bnRfcmlzay9yaXNrL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgZXZhbHVhdGlvbnMgYW5kL29yIG11bHRpcGxlIGxpbmtlZCBhY2NvdW50cy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X3VzZXJfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBvZiB3aGF0IHlvdSBhcmUgbG9va2luZyB0byBldmFsdWF0ZSAoYWNjb3VudCBhZGQsIGluZm9ybWF0aW9uIGNoYW5nZSwgZXRjLikgdG8gYWxsb3cgdXMgdG8gdGllIHRoZSBhY3Rpdml0eSB0byB0aGUgZGVjaXNpb25zIGFuZCBwb3NzaWJsZSBmcmF1ZCBvdXRjb21lIHNlbnQgdmlhIG91ciBmZWVkYmFjayBlbmRwb2ludHMuIFlvdSBjYW4gdXNlIHlvdXIgaW50ZXJuYWwgcmVxdWVzdCBJRCBvciBzaW1pbGFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2V2YWx1YXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVFdmFsdWF0aW9uUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2YWx1YXRpb25fcmVhc29uPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUV2YWx1YXRpb25SZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGZvciBldmFsdWF0aW9uIGhhcyBvY2N1cnJlZC4gUG9wdWxhdGUgdGhpcyBmaWVsZCBmb3IgYmFja2ZpbGxpbmcgZGF0YS4gSWYgeW91IGRvbuKAmXQgcG9wdWxhdGUgdGhpcyBmaWVsZCwgd2XigJlsbCB1c2UgdGhlIHRpbWVzdGFtcCBhdCB0aGUgdGltZSBvZiByZWNlaXB0LiBVc2UgSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmFsdWF0ZV90aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzdWx0cyB0byBhIHN1YnNldCBvZiB0aGUgYWNjb3VudHMgb24gdGhlIGxpbmtlZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgZm9yIHRoZSBzcGVjaWZpYyBhY2NvdW50cyB0byBldmFsdWF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIGEgcmlzayBldmFsdWF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQ+O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjaGFuZ2UgbWFkZSB0byB0aGUgcGFyZW50IG9iamVjdCBzcGVjaWZ5aW5nIHdoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyB3aGVuIGl0IG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BdWRpdFRyYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWxTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2U7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hhdCBjYXVzZWQgYSByZXNvdXJjZSB0byBiZSBjaGFuZ2VkIG9yIHVwZGF0ZWQuICAgYGRhc2hib2FyZGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBieSBhIG1lbWJlciBvZiB5b3VyIHRlYW0gdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuICBgYXBpYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIHZpYSB0aGUgUGxhaWQgQVBJLiAgYHN5c3RlbWAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgcGFydCBvZiB0aGUgUGxhaWQgQmVhY29uIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGlmIGFub3RoZXIgYnVzaW5lc3MgdXNpbmcgUGxhaWQgQmVhY29uIGNyZWF0ZWQgYSBmcmF1ZCByZXBvcnQgdGhhdCBtYXRjaGVkIG9uZSBvZiB5b3VyIHVzZXJzLCB5b3VyIG1hdGNoaW5nIHVzZXJcXCdzIHN0YXR1cyB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgYW5kIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYHN5c3RlbWAuICBgYnVsa19pbXBvcnRgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYXMgcGFydCBvZiBhIGJ1bGsgaW1wb3J0IHByb2Nlc3MuIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbXBhbnkgcHJvdmlkZWQgYSBDU1Ygb2YgdXNlciBkYXRhIGFzIHBhcnQgb2YgeW91ciBpbml0aWFsIG9uYm9hcmRpbmcsIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYGJ1bGtfaW1wb3J0YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2Uge1xuICAgIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nLFxuICAgIEJ1bGtJbXBvcnQgPSAnYnVsa19pbXBvcnQnXG59XG5cbi8qKlxuICogQmFuayBBY2NvdW50IEluc2lnaHRzIGVuY2Fwc3VsYXRlIHRoZSByaXNrIGluc2lnaHRzIGZvciBhIHNpbmdsZSBCYW5rIEFjY291bnQgbGlua2VkIHRvIGFuIEl0ZW0gdGhhdCBpcyBhc3NvY2FpdGVkIHdpdGggYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXR0cmlidXRlczogQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQmFuayBBY2NvdW50cyBsaW5rZWQgdG8gYW4gSXRlbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElEIHRoZSBCYW5rIEFjY291bnRzIGJlbG9uZyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudHNcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudHNcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmVhY29uQmFua0FjY291bnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBjcmVhdGVkIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiBtYXRjaGVzIG9uZSBvZiB5b3VyIGV4aXN0aW5nIHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERVUExJQ0FURV9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIER1cGxpY2F0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fZHVwbGljYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBEdXBsaWNhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBtYXRjaGluZyBCZWFjb24gVXNlcnMgYW5kIGFuIGFuYWx5c2lzIG9mIHRoZSBmaWVsZHMgdGhleSBtYXRjaGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMTogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIyOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gb25lIEJlYWNvbiBVc2VyIGFuZCBhbm90aGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gdHdvIEJlYWNvbiBVc2Vycy4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlci4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIHRoZSBvdGhlciBCZWFjb24gVXNlci4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG9yaWdpbmFsIEJlYWNvbiBVc2VyIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBub3QgcHJlc2VudCBpbiBvbmUgb2YgdGhlIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbk1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRDcmVhdGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0Q3JlYXRlVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ/OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIEJlYWNvbiBSZXBvcnQuICBgZmlyc3RfcGFydHlgOiBJZiB0aGlzIGlzIHRoZSBzYW1lIGluZGl2aWR1YWwgYXMgdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3RvbGVuYDogSWYgdGhpcyBpcyBhIGRpZmZlcmVudCBpbmRpdmlkdWFsIGZyb20gdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3ludGhldGljYDogSWYgdGhpcyBpcyBhbiBpbmRpdmlkdWFsIHVzaW5nIGZhYnJpY2F0ZWQgaW5mb3JtYXRpb24uICBgYWNjb3VudF90YWtlb3ZlcmA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgYWNjb3VudCB3YXMgY29tcHJvbWlzZWQuICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0Q3JlYXRlVHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2VycyBpcyBmaXJzdCByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX0NSRUFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0czogQXJyYXk8QmVhY29uUmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIHJlcHJlc2VudHMgYSBCZWFjb24gUmVwb3J0IGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdXIgb3JnYW5pemF0aW9uIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIEJlYWNvbiBVc2VyIHlvdVxcJ3ZlIGNyZWF0ZWQuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uICBUaGUgYHJlcG9ydGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzOiBBcnJheTxCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlcG9ydCBjcmVhdGVkIG9uIHRoZSBCZWFjb24gTmV0d29yayBtYXRjaGVzIHdpdGggb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9TWU5ESUNBVElPTl9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0U3luZGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25zOiBBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIGEgQmVhY29uIFJlcG9ydCB0aGF0IGhhcyBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBtYXRjaGluZyBCZWFjb24gVXNlciBpbiB5b3VyIHByb2dyYW0uICBUaGUgYGlkYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaXMgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgdGhhdCB3YXMgc3luZGljYXRlZC4gSWYgdGhlIG9yaWdpbmFsIHJlcG9ydCB3YXMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiwgdGhlIGZpZWxkIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIElEIG9mIHRoZSByZXBvcnQuIE90aGVyd2lzZSwgdGhlIGZpZWxkIHdpbGwgYmUgYG51bGxgIGluZGljYXRpbmcgdGhhdCB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGBkYXRhX2JyZWFjaGA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgZGF0YSB3YXMgY29tcHJvbWlzZWQgaW4gYSBicmVhY2guICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0VHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIGV4aXN0aW5nIEJlYWNvbiBSZXBvcnRzIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoZXRoZXIgdGhpcyBhY2NvdW50IG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IG51bWVyaWMgY2hhcmFjdGVycyBvZiB0aGlzIGFjY291bnTigJlzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhY2NvdW50X21hc2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBtYXRjaF9zdGF0dXM6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCBJdGVtIElEcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgdGhlIHJpc2sgaW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcXCdzIEJhbmsgQWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2FjY291bnQvaW5zaWdodHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkJhbmtBY2NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19hY2NvdW50X2luc2lnaHRzOiBCZWFjb25CYW5rQWNjb3VudHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIGEgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuICBUaGUgcHJpbWFyeSB1c2UgZm9yIHRoaXMgZW5kcG9pbnQgaXMgdG8gYWRkIGEgbmV3IGVuZCB1c2VyIHRvIEJlYWNvbiBmb3IgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy4gIFNvbWUgZmllbGRzIGFyZSBvcHRpb25hbCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB0byBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGlzIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgdG8gbGluayBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIgYW5kIGhhdmUgdGhlbSBldmFsdWF0ZWQgZm9yIEFjY291bnQgSW5zaWdodHMuIEEgbWF4aW11bSBvZiA1MCBhY2NvdW50cyB0b3RhbCBjYW4gYmUgYWRkZWQgdG8gYSBzaW5nbGUgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnlfYWNjb3VudHM6IEFycmF5PEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIHRoaXMgYWNjb3VudOKAmXMgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyB0aGUgaGlzdG9yeSBvZiBhIEJlYWNvbiBVc2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyczogQXJyYXk8QmVhY29uVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgSUQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGlkZW50aXR5IGRvY3VtZW50IHZhbHVlIHR5cGVkIGluIGJ5IHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC4gRm9yIHNwZWNpZmljIGZvcm1hdCByZXF1aXJlbWVudHMgYnkgSUQgdHlwZSwgc2VlIFtIeWJyaWQgSW5wdXQgVmFsaWRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24vKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay4gIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEJlYWNvbiBVc2VyLCBpbiBhZGRpdGlvbiB0byB0aGUgYG5hbWVgLCBfZWl0aGVyXyB0aGUgYGRhdGVfb2ZfYmlydGhgIF9vcl8gdGhlIGBkZXBvc2l0b3J5X2FjY291bnRzYCBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgYSBsaXN0IG9mIGJhbmsgYWNjb3VudHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuIFRoZXNlIGFjY291bnRzIHdpbGwgYmUgc2Nhbm5lZCBhY3Jvc3MgdGhlIEJlYWNvbiBOZXR3b3JrIGFuZCB1c2VkIHRvIGZpbmQgZHVwbGljYXRlIHJlY29yZHMuICBOb3RlOiBUaGVzZSBhY2NvdW50cyB3aWxsIG5vdCBoYXZlIEJhbmsgQWNjb3VudCBJbnNpZ2h0cy4gVG8gcmVjZWl2ZSBCYW5rIEFjY291bnQgSW5zaWdodHMgcGxlYXNlIHN1cHBseSBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBVUyBCYW5rIEFjY291bnQgTnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnRcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciBSZXZpc2lvbiBpZGVudGlmaWVzIGEgQmVhY29uIFVzZXIgYXQgc29tZSBwb2ludCBpbiBpdHMgcmV2aXNpb24gaGlzdG9yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdmVyc2lvbmAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXZpc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBgcmVqZWN0ZWRgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gcmVqZWN0ZWQgZm9yIGZyYXVkLiBVc2VycyBjYW4gYmUgYXV0b21hdGljYWxseSBvciBtYW51YWxseSByZWplY3RlZC4gIGBwZW5kaW5nX3Jldmlld2A6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBtYXJrZWQgZm9yIHJldmlldy4gIGBjbGVhcmVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIGNsZWFyZWQgb2YgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25Vc2VyU3RhdHVzIHtcbiAgICBSZWplY3RlZCA9ICdyZWplY3RlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgQ2xlYXJlZCA9ICdjbGVhcmVkJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciB3aGVuIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlbmQgdGhpcyBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIHRvIGFkZCBhY2NvdW50cyB0byB0aGlzIHVzZXIgZm9yIGV2YWx1YXRpb24uIFRoaXMgd2lsbCBhZGQgYWNjb3VudHMgdG8gdGhpcyBCZWFjb24gVXNlci4gSWYgbGVmdCBudWxsIG9ubHkgZXhpc3RpbmcgYWNjb3VudHMgd2lsbCBiZSByZXR1cm5lZCBpbiByZXNwb25zZS4gQSBtYXhpbXVtIG9mIDUwIGFjY291bnRzIHRvdGFsIGNhbiBiZSBhZGRlZCB0byBhIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZC4gSWYgbGVmdCB1bnNldCBvciBudWxsLCB1c2VyIGRhdGEgd2lsbCBub3QgYmUgcGF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWVOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZT86IEJlYWNvblVzZXJOYW1lTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgSXRlbSBJRHMgY29ycmVzcG9uZGluZyB0byB0aGUgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvcmVnaXN0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBsb2FucyB0byByZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblJlZ2lzdGVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2FuczogQXJyYXk8Q3JhTG9hblJlZ2lzdGVyPjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb25zIG9mIGNhc2hmbG93IGF0dHJpYnV0ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24ge1xuICAgIFYxMCA9ICd2MS4wJ1xufVxuXG4vKipcbiAqIENhdGVnb3JpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2F0ZWdvcmllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbiBjYXRlZ29yaWVzIHVzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSB0cmFuc2FjdGlvbiBjYXRlZ29yeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmeWluZyBudW1iZXIgZm9yIHRoZSBjYXRlZ29yeS4gYGNhdGVnb3J5X2lkYCBpcyBhIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gbWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBwbGFjZWAgZm9yIHBoeXNpY2FsIHRyYW5zYWN0aW9ucyBvciBgc3BlY2lhbGAgZm9yIG90aGVyIHRyYW5zYWN0aW9ucyBzdWNoIGFzIGJhbmsgY2hhcmdlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyBgY2F0ZWdvcnlfaWRgIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgaGllcmFyY2h5OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvYmplY3QgZm9yIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBDYXRlZ29yeSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkgc29ydGVkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3BfY291bnRlcnBhcnRpZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvbiBhIHVzZXJcXCdzIHRvcCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluc2lnaHRzIG9mIHRvcCBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmltYXJ5X2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIHJhbmtlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRldGFpbGVkX2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG59XG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogUGxhaWRFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2Vy4oCZcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlcuKAmXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhpcyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlQWxsT2ZcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiB0aGF0IFBsYWlkIGhhcyBlbmhhbmNlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgdHJhbnNhY3Rpb24gaWRlbnRpZmllciB0byB0aWUgdHJhbnNhY3Rpb25zIGJhY2sgdG8gY2xpZW50c1xcJyBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VuaGFuY2VtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5oYW5jZW1lbnRzOiBFbmhhbmNlbWVudHM7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVucmljaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiBhcyBwcm92aWRlZCBieSB5b3UgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHVzZXIsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfdXNlcl9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2htZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5yaWNobWVudHM6IEVucmljaG1lbnRzO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5oYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGlyZWN0aW9uLiAoTk9URTogdGhpcyB3aWxsIGFmZmVjdCBlbnJpY2htZW50IHJlc3VsdHMsIHNvIGRpcmVjdGlvbnMgYXJlIGltcG9ydGFudCk6LiAgIE5lZ2F0aXZlICgtKSBmb3IgY3JlZGl0cyAoZS5nLiwgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzKSAgIFBvc2l0aXZlICgrKSBmb3IgZGViaXRzIChlLmcuLCBwdXJjaGFzZXMsIGZlZXMsIG91dGdvaW5nIHRyYW5zZmVycylcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5yaWNoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGhlbHAgeW91IHRpZSBkYXRhIGJhY2sgdG8geW91ciBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF91c2VyX2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBJZiB5b3UgaGF2ZSBsb2NhdGlvbiBkYXRhIGluIGF2YWlsYWJsZSBhbiB1bnN0cnVjdHVyZWQgZm9ybWF0LCBpdCBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMCkuIFdoZW4gdGVzdGluZyBFbnJpY2gsIG5vdGUgdGhhdCBgYW1vdW50YCBkYXRhIHNob3VsZCBiZSByZWFsaXN0aWMuIFVucmVhbGlzdGljIG9yIGluYWNjdXJhdGUgYGFtb3VudGAgZGF0YSBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcXVhbGl0eSBvdXRwdXQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBjb2RlcyAoTUNDcykgYXJlIGZvdXItZGlnaXQgbnVtYmVycyB0aGF0IGRlc2NyaWJlIGEgbWVyY2hhbnRcXCdzIHByaW1hcnkgYnVzaW5lc3MgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWNjPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZS4gIFVzZSB0aGlzIGZpZWxkIHRvIHBhc3MgaW4gc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB5b3UgbWF5IGhhdmUgYWJvdXQgeW91ciB0cmFuc2FjdGlvbnMuIFByb3ZpZGluZyBsb2NhdGlvbiBkYXRhIGlzIG9wdGlvbmFsIGJ1dCBjYW4gaW5jcmVhc2UgcmVzdWx0IHF1YWxpdHkuIElmIHlvdSBoYXZlIHVuc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGNvbnNlbnQgZXZlbnQgb2NjdXJyZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zZW50RXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlPzogQ29uc2VudEV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfY29kZT86IENvbnNlbnRFdmVudENvZGU7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50SW5pdGlhdG9yfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I/OiBDb25zZW50RXZlbnRJbml0aWF0b3I7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyB0aGUgZW5kIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0uICBTZWUgdGhlIFtmdWxsIGxpc3RdKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jdXBkYXRpbmctbGluay1jdXN0b21pemF0aW9ucykgb2YgdXNlIGNhc2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBmdWxsIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhlIGVuZCB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtLiBUaGVzZSBjb3JyZXNwb25kIHRvIGNvbnNlbnRlZCBwcm9kdWN0czsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGF1dGhvcml6YXRpb25zIGFyZSBncmFudGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25zZW50ZWRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY29uc2VudGVkX2FjY291bnRzPzogQXJyYXk8Q29uc2VudGVkQWNjb3VudD47XG59XG4vKipcbiAqIENvZGVzIGRlc2NyaWJpbmcgdGhlIG9iamVjdCBvZiBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRDb2RlIHtcbiAgICBVc2VyQWdyZWVtZW50ID0gJ1VTRVJfQUdSRUVNRU5UJyxcbiAgICBVc2VDYXNlcyA9ICdVU0VfQ0FTRVMnLFxuICAgIERhdGFTY29wZXMgPSAnREFUQV9TQ09QRVMnLFxuICAgIEFjY291bnRTY29wZXMgPSAnQUNDT1VOVF9TQ09QRVMnXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSB0aGF0IGluaXRpYXRlZCBjb2xsZWN0aW9uIG9mIGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRJbml0aWF0b3Ige1xuICAgIFBsYWlkID0gJ1BMQUlEJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgQ3VzdG9tZXIgPSAnQ1VTVE9NRVInLFxuICAgIEVuZFVzZXIgPSAnRU5EX1VTRVInXG59XG5cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgY29uc2VudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnNlbnRFdmVudFR5cGUge1xuICAgIEdyYW50ZWQgPSAnQ09OU0VOVF9HUkFOVEVEJyxcbiAgICBSZXZva2VkID0gJ0NPTlNFTlRfUkVWT0tFRCcsXG4gICAgVXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnXG59XG5cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29uc2VudCBldmVudHMuXG4gICAgICogQHR5cGUge0FycmF5PENvbnNlbnRFdmVudD59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXZlbnRzOiBBcnJheTxDb25zZW50RXZlbnQ+O1xufVxuLyoqXG4gKiBBIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zZW50ZWRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc2VudGVkQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgdmFsaWQgZGlzcHV0ZSBzdGF0ZW1lbnQgYnkgdGhlIGNvbnN1bWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZSB7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIEEgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpIG9mIHRoZSBjb25zdW1lciBkaXNwdXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIGRpc3B1dGVkIGZpZWxkIChlLmcuIHRyYW5zYWN0aW9uIGRhdGUpLCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgZGlzcHV0ZV9maWVsZF9jcmVhdGVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lckRpc3B1dGVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRleHQgY29udGVudCBvZiBkaXNwdXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgc3RhdGVtZW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFR5cGUgb2YgZGF0YSBiZWluZyBkaXNwdXRlZCBieSB0aGUgY29uc3VtZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5IHtcbiAgICBUcmFuc2FjdGlvbiA9ICdUUkFOU0FDVElPTicsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBJZGVudGl0eSA9ICdJREVOVElUWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NvbnN1bWVyX3JlcG9ydC9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcmVhc29uIHlvdSBhcmUgZ2VuZXJhdGluZyBhIENvbnN1bWVyIFJlcG9ydCBmb3IgdGhpcyB1c2VyLiAgIGBBQ0NPVU5UX1JFVklFV19DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjb25zdW1lciBjcmVkaXQgdHJhbnNhY3Rpb24gZm9yIHRoZSByZXZpZXcgb3IgY29sbGVjdGlvbiBvZiBhbiBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgQUNDT1VOVF9SRVZJRVdfTk9OX0NSRURJVGA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBvZiB0aGUgaW5mb3JtYXRpb24gdG8gcmV2aWV3IGEgbm9uLWNyZWRpdCBhY2NvdW50IHByb3ZpZGVkIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIHB1cnBvc2VzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb25zdW1lciBjb250aW51ZXMgdG8gbWVldCB0aGUgdGVybXMgb2YgdGhlIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKSgyKS4gIGBFTVBMT1lNRU5UYDogRm9yIGVtcGxveW1lbnQgcHVycG9zZXMgcHVyc3VhbnQgdG8gRkNSQSA2MDQoYSkoMykoQiksIGluY2x1ZGluZyBoaXJpbmcsIHJldGVudGlvbiBhbmQgcHJvbW90aW9uIHB1cnBvc2VzLiAgYEVYVEVOU0lPTl9PRl9DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjcmVkaXQgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IGFuZCBpbnZvbHZpbmcgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkdgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgaW4gY29ubmVjdGlvbiB3aXRoIGEgYnVzaW5lc3MgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IHRoZSBjb25zdW1lciBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyBpbiBjb25uZWN0aW9uIHdpdGggYSBwcm9wZXJ0eSByZW50YWwgYXNzZXNzbWVudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKGkpLiAgYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX1BSRVFVQUxJRklDQVRJT05gOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCB0byBldmFsdWF0ZSBhbiBhcHBsaWNhdGlvbuKAmXMgcHJvZmlsZSB0byBtYWtlIGFuIG9mZmVyIHRvIHRoZSBjb25zdW1lci4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSYDogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3cml0dGVuIGluc3RydWN0aW9ucyBvZiB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgyKSwgc3VjaCBhcyB3aGVuIGFuIGluZGl2aWR1YWwgYWdyZWVzIHRvIGFjdCBhcyBhIGd1YXJhbnRvciBvciBhc3N1bWVzIHBlcnNvbmFsIGxpYWJpbGl0eSBmb3IgYSBjb25zdW1lciwgYnVzaW5lc3MsIG9yIGNvbW1lcmNpYWwgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlIHtcbiAgICBBY2NvdW50UmV2aWV3Q3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX0NSRURJVCcsXG4gICAgQWNjb3VudFJldmlld05vbkNyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19OT05fQ1JFRElUJyxcbiAgICBFbXBsb3ltZW50ID0gJ0VNUExPWU1FTlQnLFxuICAgIEV4dGVuc2lvbk9mQ3JlZGl0ID0gJ0VYVEVOU0lPTl9PRl9DUkVESVQnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRUZW5hbnRTY3JlZW5pbmcgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkcnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRPdGhlciA9ICdMRUdJVElNQVRFX0JVU0lORVNTX05FRURfT1RIRVInLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvblByZXF1YWxpZmljYXRpb24gPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9QUkVRVUFMSUZJQ0FUSU9OJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25PdGhlciA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSJ1xufVxuXG4vKipcbiAqIFRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGlzIGZpZWxkIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgdXNlciB0b2tlbi4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHVzZXIgdG9rZW4gY3JlYXRpb24sIHlvdSBjYW4gYWRkIGl0IHRvIHRoZSB1c2VyIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuIE9uY2UgdGhlIGZpZWxkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB1c2VyLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhIG5vbi1lbXB0eSBgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2VgICh3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0KSwgb3IgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBmb3IgdGhhdCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZmlyc3RfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGxhc3RfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTc0NTIxMzBcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWxzXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDQgZGlnaXRzIG9mIHRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgc3NuX2xhc3RfND86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIGFueSBjbGllbnRzIHdobyBiZWNhbWUgUGxhaWQgQ2hlY2sgY3VzdG9tZXJzIG9uIG9yIGFmdGVyIE9jdCAxLCAyMDI0LiBUaGlzIGZpZWxkIHdpbGwgYmUgcmVxdWlyZWQgZm9yIGFsbCBQbGFpZCBDaGVjayBjdXN0b21lcnMgYXMgb2YgRmViIDEsIDIwMjUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluc2lnaHRzIGFyb3VuZCBhIHVzZXJcXCdzIGNvdW50ZXJwYXJ0aWVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIEluc2lnaHRzIHJlbGF0ZWQgdG8gYSB1c2Vy4oCZcyB0cmFuc2FjdGlvbnMgd2l0aCBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgZmluYW5jaWFsX2luc3RpdHV0aW9uX2luc2lnaHRzPzogQXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgYWJvdXQgYSB1c2Vy4oCZcyB0b3AgbWVyY2hhbnRzLCByYW5rZWQgYnkgc3BlbmQuXG4gICAgICogQHR5cGUge0FycmF5PE1lcmNoYW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1lcmNoYW50X2luc2lnaHRzPzogQXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHkgdHlwZS4gIGBtZXJjaGFudGA6IGEgcHJvdmlkZXIgb2YgZ29vZHMgb3Igc2VydmljZXMgZm9yIHB1cmNoYXNlIGBmaW5hbmNpYWxfaW5zdGl0dXRpb25gOiBhIGZpbmFuY2lhbCBlbnRpdHkgKGJhbmssIGNyZWRpdCB1bmlvbiwgQk5QTCwgZmludGVjaCkgYHBheW1lbnRfYXBwYDogYSB0cmFuc2ZlciBvciBQMlAgYXBwIChlLmcuIFplbGxlKSBgbWFya2V0cGxhY2VgOiBhIG1hcmtldHBsYWNlIChlLmcgRG9vckRhc2gsIEdvb2dsZSBQbGF5IFN0b3JlKSBgcGF5bWVudF90ZXJtaW5hbGA6IGEgcG9pbnQtb2Ytc2FsZSBwYXltZW50IHRlcm1pbmFsIChlLmcgU3F1YXJlLCBUb2FzdCkgYGluY29tZV9zb3VyY2VgOiB0aGUgcGF5ZXIgaW4gYW4gaW5jb21lIHRyYW5zYWN0aW9uIChlLmcuLCBhbiBlbXBsb3llciwgY2xpZW50LCBvciBnb3Zlcm5tZW50IGFnZW5jeSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50ZXJwYXJ0eVR5cGUge1xuICAgIE1lcmNoYW50ID0gJ21lcmNoYW50JyxcbiAgICBGaW5hbmNpYWxJbnN0aXR1dGlvbiA9ICdmaW5hbmNpYWxfaW5zdGl0dXRpb24nLFxuICAgIFBheW1lbnRBcHAgPSAncGF5bWVudF9hcHAnLFxuICAgIE1hcmtldHBsYWNlID0gJ21hcmtldHBsYWNlJyxcbiAgICBQYXltZW50VGVybWluYWwgPSAncGF5bWVudF90ZXJtaW5hbCcsXG4gICAgSW5jb21lU291cmNlID0gJ2luY29tZV9zb3VyY2UnXG59XG5cbi8qKlxuICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50cnlDb2RlIHtcbiAgICBVcyA9ICdVUycsXG4gICAgR2IgPSAnR0InLFxuICAgIEVzID0gJ0VTJyxcbiAgICBObCA9ICdOTCcsXG4gICAgRnIgPSAnRlInLFxuICAgIEllID0gJ0lFJyxcbiAgICBDYSA9ICdDQScsXG4gICAgRGUgPSAnREUnLFxuICAgIEl0ID0gJ0lUJyxcbiAgICBQbCA9ICdQTCcsXG4gICAgRGsgPSAnREsnLFxuICAgIE5vID0gJ05PJyxcbiAgICBTZSA9ICdTRScsXG4gICAgRWUgPSAnRUUnLFxuICAgIEx0ID0gJ0xUJyxcbiAgICBMdiA9ICdMVicsXG4gICAgUHQgPSAnUFQnLFxuICAgIEJlID0gJ0JFJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIFBsYWlkIENoZWNrIEluY29tZSBJbnNpZ2h0cyBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgcmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIG9iamVjdCB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgSXRlbVxcJ3MgYmFuayBhY2NvdW50cyB0aGF0IGhhdmUgdGhlIHNlbGVjdGVkIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWV0YWRhdGE6IENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgZXh0cmFjdGVkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZXh0cmFjdGVkIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYm9udXMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHJlcHJlc2VudHMsIGlmIGl0IGlzIGEgYm9udXMuIGBCT05VU19JTkNMVURFRGA6IEJvbnVzIGlzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24gYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHBheSBgQk9OVVNfT05MWWA6IFRoaXMgdHJhbnNhY3Rpb24gaXMgYSBzdGFuZGFsb25lIGJvbnVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lQm9udXNUeXBlIHtcbiAgICBCb251c0luY2x1ZGVkID0gJ0JPTlVTX0lOQ0xVREVEJyxcbiAgICBCb251c09ubHkgPSAnQk9OVVNfT05MWScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZUNvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDUkFfSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdD86IENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggd2ViaG9va3Mgd2lsbCBiZSBzZW50IFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U/OiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmFpbGVkIHRvIGdlbmVyYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyYUJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIGJhbmsgaW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50czogQXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzOiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgd2l0aCB3aGljaCB0aGlzIGluY29tZSBzb3VyY2UgaXMgYXNzb2NpYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGVuZCB1c2Vy4oCZcyBuZXh0IHBheWNoZWNrIGZvciB0aGUgaW5jb21lIHNvdXJjZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3Rpb24gaW50ZXJ2YWwocykgZm9yIHRoZSBmb3JlY2FzdGVkIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUuXG4gICAgICogQHR5cGUge0FycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWVfcHJlZGljdGlvbl9pbnRlcnZhbHM6IEFycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBncm9zcyBtb250aGx5IGluY29tZSBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBuZXQgYW1vdW50IGFuZCBpbmNvbWUgY2F0ZWdvcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2dyb3NzX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBncm9zcyBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2FubnVhbF9ncm9zc19pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbm51YWwgaW5jb21lIGFtb3VudCBlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGF0YSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hbm51YWxfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYW5udWFsX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVCb251c1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGJvbnVzX3R5cGU/OiBDcmFCYW5rSW5jb21lQm9udXNUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlPzogQ3JhQmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBJREVOVElUWV9VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IGlkZW50aXR5IGZvciB0aGUgSXRlbSBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgdHJhbnNhY3Rpb25zIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIFJlcG9ydERlbGV0ZWQgPSAnUkVQT1JUX0RFTEVURUQnLFxuICAgIERhdGFVbmF2YWlsYWJsZSA9ICdEQVRBX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIENyYUJhc2VSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvYmFzZV9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIGRhdGEgZm9yIHRoZSBDUkEgQ2FzaGZsb3cgSW5zaWdodHMgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRDaGVja1Njb3JlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcGxhaWRfY2hlY2tfc2NvcmU/OiBQbGFpZENoZWNrU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2hmbG93IGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgaXMgYSBmbG9hdCwgaW50LCBvciBib29sZWFuLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogb2JqZWN0O1xufVxuLyoqXG4gKiBCYXNlUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBJRHMgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuIElmIG5vdCBwcm92aWRlZCwgYWxsIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB3aWxsIGJlIGluY2x1ZGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvYmFzZV9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEJhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEJhc2UgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxCYXNlUmVwb3J0V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBDYXNoZmxvdyBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIFBsYWlkIENoZWNrIHNjb3JlIHRvIHJldHVyblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBwbGFpZF9jaGVja19zY29yZV92ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCB3ZWJob29rcyB3aWxsIGJlIHNlbnQgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSByZXBvcnQuIERlZmF1bHQgdmFsdWUgaXMgMzY1OyBtYXhpbXVtIGlzIDczMTsgbWluaW11bSBpcyAxODAuIElmIGEgdmFsdWUgbG93ZXIgdGhhbiAxODAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAxODAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRheXMgb2YgZGF0YSByZXF1aXJlZCBmb3IgdGhlIHJlcG9ydCB0byBiZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWlyZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZTogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIENoZWNrIFJlcG9ydCBoYXMgZmFpbGVkIHRvIGdlbmVyYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ0hFQ0tfUkVQT1JUX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9pbmNvbWVfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQ3JhSW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19hdHRyaWJ1dGVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19hdHRyaWJ1dGVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTmV0d29ya0luc2lnaHRzUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIGluY2x1ZGUgb3RoZXIgcmVwb3J0cyBpbiB0aGUgUERGLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQREZBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8Q3JhUERGQWRkT25zPjtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgUGFydG5lciBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWZpYyBQcmlzbSBEYXRhIHByb2R1Y3RzIHRvIHJldHVybi4gSWYgbm9uZSBhcmUgcGFzc2VkIGluLCB0aGVuIGFsbCBwcm9kdWN0cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcmlzbVByb2R1Y3Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcmlzbV9wcm9kdWN0cz86IEFycmF5PFByaXNtUHJvZHVjdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9ucyB8IG51bGw7XG59XG4vKipcbiAqIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQ3JhUGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBDaGVjayBSZXBvcnQgYXJlIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB0aGUgcmVwb3J0IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHJldHJpZXZlIGZvciAyNCBob3Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGl0ZW1faWRzYCB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBDaGVjayBSZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0IGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ2hlY2sgSW5jb21lIEluc2lnaHRzIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpdGVtcz86IEFycmF5PENyYUJhbmtJbmNvbWVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyYUJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgb2JqZWN0IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4gYXBwbGljYXRpb24uICBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgYXBwbGljYXRpb25faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB0eXBlOiBDcmFMb2FuVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbkFwcGxpY2F0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdXNlciBhcHBsaWVkIGZvciB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBsb2FuIGFwcGxpY2F0aW9uXFwncyBkZWNpc2lvbiB3YXMgbWFkZS4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb25fZGF0ZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRlY2lzaW9uIG9mIHRoZSBsb2FuIGFwcGxpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhTG9hbkFwcGxpY2F0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCcsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXR1cyBhbmQgZGF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgbG9hbiB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5DbG9zZWRTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuQ2xvc2VkU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICAgICAqL1xuICAgIHN0YXR1czogQ3JhTG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgZWZmZWN0aXZlIGRhdGUgZm9yIHRoZSBzdGF0dXMgb2YgdGhlIGxvYW4uIFRoZSBkYXRlIHNob3VsZCBiZSBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5DbG9zZWRTdGF0dXNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0dXMgYW5kIGRhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGxvYW4gd2hlbiByZWdpc3RlcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbk9wZW5lZFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5PcGVuZWRTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbk9wZW5lZFN0YXR1c1xuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHBheW1lbnQgaW5mb3JtYXRpb24gZm9yIGEgbG9hbiBwYXltZW50IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblBheW1lbnRIaXN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggdG8gaWRlbnRpZnkgdGhlIGxvYW5cXCdzIHBheW1lbnQgcGVyaW9kLCBzdGFydGluZyBmcm9tIDEuIEZvciBleGFtcGxlOiAgIDEgbWVhbnMgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZSBsb2FuXFwncyBvcGVuaW5nIGRhdGUgYW5kIHRoZSAxc3QgcGF5bWVudCBkdWUgZGF0ZS4gICAyIG1lYW5zIHRoZSBwZXJpb2QgYmV0d2VlbiB0aGUgbG9hblxcJ3MgMXN0IHBheW1lbnQgZHVlIGRhdGUgYW5kIDJuZCBwYXltZW50IGR1ZSBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIHBlcmlvZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGR1ZSBkYXRlIG9yIGVuZCBkYXRlIG9mIHRoZSBwYXltZW50IHBlcmlvZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgZHVlX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgdGhlIGxvYW4gd2FzIGRlbGlucXVlbnQgYXQgdGhlIGVuZCBvZiB0aGUgcGF5IHBlcmlvZC4gSWYgc3BlY2lmaWVkLCBzaG91bGQgYmUgZ3JlYXRlciBvZiBlcXVhbCB0byAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIGRheXNfcGFzdF9kdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHBhc3QgZHVlIG9yIHRoZSBjaGFyZ2Utb2ZmIGFtb3VudCBvZiB0aGUgbG9hbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXltZW50IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBhbW91bnRfcGFzdF9kdWU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbGFuY2UgcmVtYWluaW5nIG9uIHRoZSBsb2FuIGF0IHRoZSBlbmQgb2YgdGhlIHBheW1lbnQgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIGJhbGFuY2VfcmVtYWluaW5nPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIGEgbG9hblxcJ3MgcGF5bWVudCBzY2hlZHVsZS4gYEJJV0VFS0xZYCByZXByZXNlbnRzIG9uZSBwYXltZW50IGV2ZXJ5IHR3byB3ZWVrcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5QYXltZW50U2NoZWR1bGUge1xuICAgIERhaWx5ID0gJ0RBSUxZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBRdWFydGVybHkgPSAnUVVBUlRFUkxZJyxcbiAgICBBbm51YWxseSA9ICdBTk5VQUxMWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIHRvIHJlZ2lzdGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuUmVnaXN0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuUmVnaXN0ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGZvciB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiAgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGxvYW5faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuUGF5bWVudFNjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3NjaGVkdWxlOiBDcmFMb2FuUGF5bWVudFNjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSBsb2FuIGFjY291bnQgd2FzIG9wZW5lZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbk9wZW5lZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX3dpdGhfc3RhdHVzOiBDcmFMb2FuT3BlbmVkU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIGFwcHJvdmVkIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgbG9hbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbj86IENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEgdG8gcmVnaXN0ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuIGFwcGxpY2F0aW9uLiAgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGFwcGxpY2F0aW9uX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB1c2VyIGFwcGxpZWQgZm9yIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2RhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnLFxuICAgIEJvb2tlZCA9ICdCT09LRUQnLFxuICAgIEN1cnJlbnQgPSAnQ1VSUkVOVCcsXG4gICAgRGVsaW5xdWVudCA9ICdERUxJTlFVRU5UJyxcbiAgICBEZWZhdWx0ID0gJ0RFRkFVTFQnLFxuICAgIENoYXJnZWRPZmYgPSAnQ0hBUkdFRF9PRkYnLFxuICAgIFRyYW5zZmVycmVkID0gJ1RSQU5TRkVSUkVEJyxcbiAgICBQYWlkT2ZmID0gJ1BBSURfT0ZGJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgc3RhdHVzIGFuZCBkYXRlIG9mIGFuIHVwZGF0ZSB0byB0aGUgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5TdGF0dXNIaXN0b3J5VXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGxvYW4gdGhlIHVzZXIgYXBwbGllZCBmb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuVHlwZSB7XG4gICAgUGVyc29uYWwgPSAnUEVSU09OQUwnLFxuICAgIENyZWRpdENhcmQgPSAnQ1JFRElUX0NBUkQnLFxuICAgIEJ1c2luZXNzID0gJ0JVU0lORVNTJyxcbiAgICBNb3J0Z2FnZSA9ICdNT1JUR0FHRScsXG4gICAgQXV0byA9ICdBVVRPJyxcbiAgICBQYXlkYXkgPSAnUEFZREFZJyxcbiAgICBTdHVkZW50ID0gJ1NUVURFTlQnLFxuICAgIEhvbWVFcXVpdHkgPSAnSE9NRV9FUVVJVFknLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGxvYW4gZGF0YSBmb3IgdGhlIGxvYW4gYmVpbmcgdW5yZWdpc3RlcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuVW5yZWdpc3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9hbi4gIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBsb2FuX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVW5yZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbkNsb3NlZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBjbG9zZWRfd2l0aF9zdGF0dXM6IENyYUxvYW5DbG9zZWRTdGF0dXM7XG59XG4vKipcbiAqIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblVucmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGRhdGEgdG8gdXBkYXRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuVXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4uICBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVwZGF0ZVxuICAgICAqL1xuICAgIGxvYW5faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0YXR1cyB1cGRhdGUgaGlzdG9yeSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzX2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIHVwZGF0ZXMgdG8gdGhlIHBheW1lbnQgaGlzdG9yeSBmb3IgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge0FycmF5PENyYUxvYW5QYXltZW50SGlzdG9yeT59XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VcGRhdGVcbiAgICAgKi9cbiAgICBwYXltZW50X2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuUGF5bWVudEhpc3Rvcnk+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGxvYW4gYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q3JhTG9hbkFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy9yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdW5yZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblVucmVnaXN0ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VbnJlZ2lzdGVyPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdXBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuVXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VcGRhdGU+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlOiBNb25pdG9yaW5nQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYGNyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGEgVXNlciBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2luc2lnaHRzX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgTW9uaXRvcmluZyBJbnNpZ2h0cyBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIE1vbml0b3JpbmcgSW5zaWdodHMgSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgc3BlY2lmaWMgaW5zaWdodHMgd2VyZSBnZW5lcmF0ZWQgKHBlci1pdGVtKSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnNpZ2h0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc2lnaHRzOiBNb25pdG9yaW5nSW5zaWdodHMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL3N1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBNb25pdG9yaW5nIEluc2lnaHRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgTW9uaXRvcmluZyBJbnNpZ2h0cyBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3Vic2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdWJzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgY3JhL21vbml0b3JpbmdfaW5zaWdodHMvdW5zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgbmV0d29yayBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBuZXR3b3JrX2F0dHJpYnV0ZXM6IG9iamVjdDtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbXMgdGhlIGVuZCB1c2VyIGNvbm5lY3RlZCBpbiBMaW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFOZXR3b3JrSW5zaWdodHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgUERGLiAgYGNyYV9pbmNvbWVfaW5zaWdodHNgOiBJbmNsdWRlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgaW4gdGhlIFBERi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBERkFkZE9ucyB7XG4gICAgQ3JhSW5jb21lSW5zaWdodHMgPSAnY3JhX2luY29tZV9pbnNpZ2h0cydcbn1cblxuLyoqXG4gKiBUaGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgb2YgdGhlIGJhbmsgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIFBhcnRuZXIgSW5zaWdodHMgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNQcmlzbX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc20/OiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyB1c2VkIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwYXJ0bmVyIGluc2lnaHRzIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9JTlNJR0hUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUl9JTlNJR0hUU19DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBhcnRuZXIgaW5zaWdodHMgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOU0lHSFRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSX0lOU0lHSFRTX0VSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGF0IHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGluIHRoZSBpdGVtXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnQ+O1xufVxuLyoqXG4gKiBBY2NvdW50IGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgaXRlbSBmcm9tIHdoaWNoIFBhcnRuZXIgSW5zaWdodHMgd2VyZSBnZW5lcmF0ZWQgZnJvbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBQcmlzbSBEYXRhIGluc2lnaHRzIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgY2FzaF9zY29yZT86IFByaXNtQ2FzaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21GaXJzdERldGVjdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBmaXJzdF9kZXRlY3Q/OiBQcmlzbUZpcnN0RGV0ZWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHdoZXRoZXIgdGhlIFByaXNtIERhdGEgYXR0cmlidXRlcyBzdWNjZWVkZWQgb3IgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJlZGljdGlvbiBpbnRlcnZhbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgcHJlZGljdGVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHByb2JhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICAgICAqL1xuICAgIGxvd2VyX2JvdW5kPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHByZWRpY3RlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBwcm9iYWJpbGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1cHBlcl9ib3VuZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBmYWxsaW5nIHdpdGhpbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kLiBUaGlzIGlzIGEgcGVyY2VudGFnZSByZXByZXNlbnRlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICBwcm9iYWJpbGl0eT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBDaGVjayBSZXBvcnQgdXBncmFkZSBhdHRlbXB0IGhhcyBmYWlsZWRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFVcGdyYWRlRmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVUEdSQURFX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVVwZ3JhZGVGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgZm9yIGl0ZW1zIHRoYXQgZmFpbGVkIHRvIGJlIHVwZ3JhZGVkIGJ5IGEgQ2hlY2sgUmVwb3J0IHVwZ3JhZGUgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIDEwOTkgdGF4IGZvcm1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTkge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9ybTEwOTlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZm9ybV8xMDk5X3R5cGU/OiBGb3JtMTA5OVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBDcmVkaXQxMDk5UmVjaXBpZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5UGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcj86IENyZWRpdDEwOTlQYXllcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OUZpbGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlsZXI/OiBDcmVkaXQxMDk5RmlsZXI7XG4gICAgLyoqXG4gICAgICogVGF4IHllYXIgb2YgdGhlIHRheCBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIHJlbnQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcm95YWx0aWVzIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByb3lhbHRpZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBvdGhlciBpbmNvbWUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG90aGVyX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmaXNoaW5nIGJvYXQgcHJvY2VlZHMgZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlzaGluZ19ib2F0X3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbWVkaWNhbCBhbmQgaGVhbHRoY2FyZSBwYXltZW50cyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtZWRpY2FsX2FuZF9oZWFsdGhjYXJlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygbm9uZW1wbG95ZWUgY29tcGVuc2F0aW9uIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vbmVtcGxveWVlX2NvbXBlbnNhdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN1YnN0aXR1dGUgcGF5bWVudHMgbWFkZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3Vic3RpdHV0ZV9wYXltZW50c19pbl9saWV1X29mX2RpdmlkZW5kc19vcl9pbnRlcmVzdD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgcGF5ZXIgbWFkZSBkaXJlY3Qgc2FsZXMgb3ZlciAkNTAwMCBvZiBjb25zdW1lciBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfbWFkZV9kaXJlY3Rfc2FsZXNfb2ZfNTAwMF9vcl9tb3JlX29mX2NvbnN1bWVyX3Byb2R1Y3RzX3RvX2J1eWVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgY3JvcCBpbnN1cmFuY2UgcHJvY2VlZHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGNyb3BfaW5zdXJhbmNlX3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ29sZGVuIHBhcmFjaHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBleGNlc3NfZ29sZGVuX3BhcmFjaHV0ZV9wYXltZW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGdyb3NzIHByb2NlZWRzIHBhaWQgdG8gYW4gYXR0b3JuZXkgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX3Byb2NlZWRzX3BhaWRfdG9fYW5fYXR0b3JuZXk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGRlZmVycmFscyBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9kZWZlcnJhbHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGluY29tZSBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBzdGF0ZSB0YXggd2l0aGhlbGQgb2YgcGF5ZXIgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV90YXhfd2l0aGhlbGRfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9zdGF0ZV9udW1iZXJfbG93ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgcmVwb3J0ZWQgZm9yIHNlY29uZGFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX2xvd2VyPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkIFBheW1lbnQgY2FyZCBUaGlyZCBwYXJ0eSBuZXR3b3JrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19yZXBvcnRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgUFNFIChQYXltZW50IFNldHRsZW1lbnQgRW50aXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHNlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCAoWFhYKSBYWFgtWFhYWC4gUGhvbmUgbnVtYmVyIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgYW1vdW50IHJlcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBncm9zc19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBjYXJkIG5vdCBwcmVzZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY2FyZF9ub3RfcHJlc2VudF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lcmNoYW50X2NhdGVnb3J5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfcGF5bWVudF90cmFuc2FjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSmFudWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgamFudWFyeV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgRmVicnVhcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlYnJ1YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXJjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWFyY2hfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEFwcmlsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhcHJpbF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTWF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bmVfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bHlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEF1Z3VzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgYXVndXN0X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBTZXB0ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlcHRlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgT2N0b2Jlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb2N0b2Jlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTm92ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vdmVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBEZWNlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZGVjZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIG9mIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSB0YXggcmVwb3J0ZWQgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlciB1c2VkIGJ5IDEwOTktSyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkOiBQYXltZW50IFNldHRsZW1lbnQgRW50aXR5IChQU0UpLCBFbGVjdHJvbmljIFBheW1lbnQgRmFjaWxpdGF0b3IgKEVQRiksIE90aGVyIFRoaXJkIFBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXllciB1c2VkIGJ5IDEwOTktTUlTQyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbGVwaG9uZSBudW1iZXIgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZWNpcGllbnQgdXNlZCBpbiBib3RoIDEwOTktSyBhbmQgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRheCBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaGVja2VkIGlmIEZBQ1RBIGlzIGEgZmlsaW5nIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmYWN0YV9maWxpbmdfcmVxdWlyZW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgMm5kIFRJTiBleGlzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHNlY29uZF90aW5fZXhpc3RzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGNyZWRpdCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWNyZWRpdCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBY2NvdW50U3VidHlwZSB7XG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBUaGlzIGNvbnRhaW5zIGFuIGFtb3VudCwgZGVub21pbmF0ZWQgaW4gdGhlIGN1cnJlbmN5IHNwZWNpZmllZCBieSBlaXRoZXIgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3kge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuczsgY2FuIGluY2x1ZGUgYXQgbW9zdCBvbmUgVk9BL3N0YW5kYXJkIEFzc2V0IFJlcG9ydCB0b2tlbnMgYW5kIG9uZSBWT0UgQXNzZXQgUmVwb3J0IFRva2VuLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciwgd2hpY2ggYWxsb3dzIHRoZW0gdG8gZmV0Y2ggdGhlIEFzc2V0IFJlcG9ydHMgYXR0YWNoZWQgdG8gdGhlIHRva2VuLiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRva2VucyB3aGljaCB0aGUgc3BlY2lmaWVkIEF1ZGl0IENvcHkgVG9rZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGguIFRoZSB0eXBlcyBvZiB0b2tlbiBzdXBwb3J0ZWQgYXJlIGFzc2V0IHJlcG9ydCB0b2tlbiBhbmQgZW1wbG95bWVudCByZXBvcnQgdG9rZW4uIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDEgb2YgZWFjaCB0b2tlbiB0eXBlIGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSBUb2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEJhbmtFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBsYXRlc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGRlcG9zaXQgZnJvbSB0aGlzIGVtcGxveWVyIGZyb20gd2l0aGluIHRoZSBwZXJpb2Qgb2YgdGhlIGRheXMgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZWFybGllc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEJhbmsgRW1wbG95bWVudCBkYXRhLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIGEgZGlzdGluY3QgYmFuayBlbXBsb3ltZW50IHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydHM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBkaWZmZXJlbnQgZW1wbG95ZXIgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBFbXBsb3ltZW50IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2FjY291bnRzOiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG59XG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0IHdhcyBnZW5lcmF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEVtcGxveW1lbnQgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19FTVBMT1lNRU5UX1dBUk5JTkdgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZSB7XG4gICAgQmFua0VtcGxveW1lbnRXYXJuaW5nID0gJ0JBTktfRU1QTE9ZTUVOVF9XQVJOSU5HJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgaXRlbXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUaGUgYWNjb3VudCB0eXBlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGBkZXBvc2l0b3J5YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZSB7XG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5J1xufVxuXG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkuICBgQkFOS19JTlRFUkVTVGA6IEludGVyZXN0IGVhcm5lZCBmcm9tIGEgYmFuayBhY2NvdW50LiBgQkVORUZJVF9PVEhFUmA6IEdvdmVybm1lbnQgYmVuZWZpdHMgb3RoZXIgdGhhbiByZXRpcmVtZW50LCB1bmVtcGxveW1lbnQsIGNoaWxkIHN1cHBvcnQsIG9yIGRpc2FiaWxpdHkuIEN1cnJlbnRseSB1c2VkIG9ubHkgaW4gdGhlIFVLLCB0byByZXByZXNlbnQgYmVuZWZpdHMgc3VjaCBhcyBDb3N0IG9mIExpdmluZyBQYXltZW50cy4gYENBU0hgOiBEZXByZWNhdGVkIGFuZCB1c2VkIG9ubHkgZm9yIGV4aXN0aW5nIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbnMuIEhhcyBiZWVuIHJlcGxhY2VkIGJ5IGBDQVNIX0RFUE9TSVRgIGFuZCBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmAuIGBDQVNIX0RFUE9TSVRgOiBBIGNhc2ggb3IgY2hlY2sgZGVwb3NpdC4gYENISUxEX1NVUFBPUlRgOiBDaGlsZCBzdXBwb3J0IHBheW1lbnRzIHJlY2VpdmVkLiBgR0lHX0VDT05PTVlgOiBJbmNvbWUgZWFybmVkIGFzIGEgZ2lnIGVjb25vbXkgd29ya2VyLCBlLmcuIGRyaXZpbmcgZm9yIFViZXIsIEx5ZnQsIFBvc3RtYXRlcywgRG9vckRhc2gsIGV0Yy4gYExPTkdfVEVSTV9ESVNBQklMSVRZYDogRGlzYWJpbGl0eSBwYXltZW50cywgaW5jbHVkaW5nIFNvY2lhbCBTZWN1cml0eSBkaXNhYmlsaXR5IGJlbmVmaXRzLiBgT1RIRVJgOiBJbmNvbWUgdGhhdCBjb3VsZCBub3QgYmUgY2F0ZWdvcml6ZWQgYXMgYW55IG90aGVyIGluY29tZSBjYXRlZ29yeS4gYE1JTElUQVJZYDogVmV0ZXJhbnMgYmVuZWZpdHMuIEluY29tZSBlYXJuZWQgYXMgc2FsYXJ5IGZvciBzZXJ2aW5nIGluIHRoZSBtaWxpdGFyeSAoZS5nLiB0aHJvdWdoIERGQVMpIHdpbGwgYmUgY2xhc3NpZmllZCBhcyBgU0FMQVJZYCByYXRoZXIgdGhhbiBgTUlMSVRBUllgLiAgYFJFTlRBTGA6IEluY29tZSBlYXJuZWQgZnJvbSBhIHJlbnRhbCBwcm9wZXJ0eS4gSW5jb21lIG1heSBiZSBpZGVudGlmaWVkIGFzIHJlbnRhbCB3aGVuIHRoZSBwYXltZW50IGlzIHJlY2VpdmVkIHRocm91Z2ggYSByZW50YWwgcGxhdGZvcm0sIGUuZy4gQWlyYm5iOyByZW50IHBhaWQgZGlyZWN0bHkgYnkgdGhlIHRlbmFudCB0byB0aGUgcHJvcGVydHkgb3duZXIgKGUuZy4gdmlhIGNhc2gsIGNoZWNrLCBvciBBQ0gpIHdpbGwgdHlwaWNhbGx5IG5vdCBiZSBjbGFzc2lmaWVkIGFzIHJlbnRhbCBpbmNvbWUuICBgUkVUSVJFTUVOVGA6IFBheW1lbnRzIGZyb20gcHJpdmF0ZSByZXRpcmVtZW50IHN5c3RlbXMsIHBlbnNpb25zLCBhbmQgZ292ZXJubWVudCByZXRpcmVtZW50IHByb2dyYW1zLCBpbmNsdWRpbmcgU29jaWFsIFNlY3VyaXR5IHJldGlyZW1lbnQgYmVuZWZpdHMuIGBTQUxBUllgOiBQYXltZW50IGZyb20gYW4gZW1wbG95ZXIgdG8gYW4gZWFybmVyIG9yIG90aGVyIGZvcm0gb2YgcGVybWFuZW50IGVtcGxveW1lbnQuIGBUQVhfUkVGVU5EYDogQSB0YXggcmVmdW5kLiBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmA6IERlcG9zaXRzIGZyb20gYSBtb25leSB0cmFuc2ZlciBhcHAsIHN1Y2ggYXMgVmVubW8sIENhc2ggQXBwLCBvciBaZWxsZS4gYFVORU1QTE9ZTUVOVGA6IFVuZW1wbG95bWVudCBiZW5lZml0cy4gSW4gdGhlIFVLLCBpbmNsdWRlcyBjZXJ0YWluIGxvdy1pbmNvbWUgYmVuZWZpdHMgc3VjaCBhcyB0aGUgVW5pdmVyc2FsIENyZWRpdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3YXJuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlIHtcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gICAgSW5zdWZmaWNpZW50Q3JlZGVudGlhbHMgPSAnSU5TVUZGSUNJRU5UX0NSRURFTlRJQUxTJyxcbiAgICBJdGVtTG9ja2VkID0gJ0lURU1fTE9DS0VEJyxcbiAgICBVc2VyU2V0dXBSZXF1aXJlZCA9ICdVU0VSX1NFVFVQX1JFUVVJUkVEJyxcbiAgICBDb3VudHJ5Tm90U3VwcG9ydGVkID0gJ0NPVU5UUllfTk9UX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Eb3duID0gJ0lOU1RJVFVUSU9OX0RPV04nLFxuICAgIEluc3RpdHV0aW9uTm9Mb25nZXJTdXBwb3J0ZWQgPSAnSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Ob3RSZXNwb25kaW5nID0gJ0lOU1RJVFVUSU9OX05PVF9SRVNQT05ESU5HJyxcbiAgICBJbnZhbGlkQ3JlZGVudGlhbHMgPSAnSU5WQUxJRF9DUkVERU5USUFMUycsXG4gICAgSW52YWxpZE1mYSA9ICdJTlZBTElEX01GQScsXG4gICAgSW52YWxpZFNlbmRNZXRob2QgPSAnSU5WQUxJRF9TRU5EX01FVEhPRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgTWZhTm90U3VwcG9ydGVkID0gJ01GQV9OT1RfU1VQUE9SVEVEJyxcbiAgICBOb0FjY291bnRzID0gJ05PX0FDQ09VTlRTJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgQWNjZXNzTm90R3JhbnRlZCA9ICdBQ0NFU1NfTk9UX0dSQU5URUQnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBCYW5rIEluY29tZSBSZXBvcnRzIHNob3VsZCBiZSBmZXRjaGVkLiBNdWx0aXBsZSByZXBvcnRzIG1heSBiZSBhdmFpbGFibGUgaWYgdGhlIHJlcG9ydCBoYXMgYmVlbiByZS1jcmVhdGVkIG9yIHJlZnJlc2hlZC4gSWYgbW9yZSB0aGFuIG9uZSByZXBvcnQgaXMgYXZhaWxhYmxlLCB0aGUgbW9zdCByZWNlbnQgcmVwb3J0cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgSW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50cz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc291cmNlcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVTb3VyY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluY29tZSBwYXkgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeSB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgZGF5cyBvZiBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIHJlZnJlc2guIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB0aGUgbW9zdCByZWNlbnRseSBnZW5lcmF0ZWQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluY29tZSBzb3VyY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBpbiB0aGUgdXNlcuKAmXMgYmFuayBhY2NvdW50IGZvciB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgZm9yIHRoZSBpbmNvbWUgc291cmNlIHdpdGhpbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFN1bW1hcnkgZm9yIGJhbmsgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBtYXkgcmV0dXJuIGFuIGluY29ycmVjdCB2YWx1ZSBpZiB0aGUgc3VtbWFyeSBpbmNsdWRlcyBpbmNvbWUgc291cmNlcyBpbiBtdWx0aXBsZSBjdXJyZW5jaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFRoZSB0cmFuc2FjdGlvbnMgZGF0YSBmb3IgdGhlIGVuZCB1c2VyXFwncyBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3kgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBjcmVkaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50LCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYElURU1fVU5BUFBST1ZFRGA6IFVzZXIgZXhpdGVkIGZsb3cgYmVmb3JlIGdpdmluZyBwZXJtaXNzaW9uIHRvIHNoYXJlIGRhdGEgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgSXRlbVVuYXBwcm92ZWQgPSAnSVRFTV9VTkFQUFJPVkVEJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0lOQ09NRV9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZSB7XG4gICAgQmFua0luY29tZVdhcm5pbmcgPSAnQkFOS19JTkNPTUVfV0FSTklORydcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kaW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN0YXRlbWVudCB1cGxvYWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB3aG9zZSBiYW5rIHN0YXRlbWVudHMgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LiBBUFIgaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGJ5IGFsbCBjYXJkIGlzc3VlcnM7IGlmIEFQUiBkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QVBSPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFwcnM6IEFycmF5PEFQUj47XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG93ZWQgYXMgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGlzc3VlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBjcmVkaXQgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgY3N2IGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGNyZWRpdCBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBQQVlTVFVCYDogQSBwYXlzdHViLiAgYEJBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBVU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYFVTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfTEVTYDogQSBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBHSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBQTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBOT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBVUkwgdG8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgZmlsZS4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgZmlsZSB0eXBlIHdpbGwgYWx3YXlzIGJlIFBERiwgYW5kIHRoZSBmaWxlIG1heSBub3QgYmUgYXZhaWxhYmxlLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYC4gSWYgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZ2VuZXJhdGUgYSBQREYgaWYgdGhlIG9yaWdpbmFsIGlzIG5vdCBhdmFpbGFibGUsIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIFtFeGFtcGxlIGdlbmVyYXRlZCBwYXkgc3R1Yl0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3VtZW50cy9wbGFpZC1nZW5lcmF0ZWQtbW9jay1wYXlzdHViLnBkZikuICBGb3IgRG9jdW1lbnQgSW5jb21lLCB0aGlzIGZpZWxkIHdpbGwgbm90IGJlIGBudWxsYCwgYW5kIHRoZSBmaWxlIHR5cGUgd2lsbCBiZSB0aGUgb3JpZ2luYWwgZmlsZSB0eXBlIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLiBGb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBmaWxlIHR5cGVzLCBzZWUgdGhlIFtEb2N1bWVudCBJbmNvbWVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2luY29tZS9wYXlyb2xsLWluY29tZSkgZG9jdW1lbnRhdGlvbi4gIFRoaXMgZG93bmxvYWQgVVJMIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBhbmQgZXhwaXJlcyBhZnRlciB0d28gbWludXRlcy4gVG8gZ2VuZXJhdGUgYSBuZXcgZG93bmxvYWQgVVJMLCBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgYWdhaW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvd25sb2FkX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudCAoaWYgYXZhaWxhYmxlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aHkgYSBmYWlsdXJlIG9jY3VycmVkIGR1cmluZyBkb2N1bWVudCBwcm9jZXNzaW5nIChpZiBhdmFpbGFibGUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbXBsb3ltZW50IGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveW1lbnQgaXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRva2VuIHRvIHJlcHJlc2VudCB0aGUgdW5kZXJseWluZyBFbXBsb3ltZW50IGRhdGFcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZCBvZiBlbXBsb3ltZW50LCBpZiBhcHBsaWNhYmxlLiBQcm92aWRlZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGxhdGZvcm1JZHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwbGF0Zm9ybV9pZHM6IENyZWRpdFBsYXRmb3JtSWRzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGVtcGxveW1lbnQgZm9yIHRoZSBpbmRpdmlkdWFsLiBgXFxcIkZVTExfVElNRVxcXCJgOiBBIGZ1bGwtdGltZSBlbXBsb3llZS4gYFxcXCJQQVJUX1RJTUVcXFwiYDogQSBwYXJ0LXRpbWUgZW1wbG95ZWUuIGBcXFwiQ09OVFJBQ1RPUlxcXCJgOiBBbiBlbXBsb3llZSB0eXBpY2FsbHkgaGlyZWQgZXh0ZXJuYWxseSB0aHJvdWdoIGEgY29udHJhY3RpbmcgZ3JvdXAuIGBcXFwiVEVNUE9SQVJZXFxcImA6IEEgdGVtcG9yYXJ5IGVtcGxveWVlLiBgXFxcIk9USEVSXFxcImA6IFRoZSBlbXBsb3llZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgdHlwZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVlX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVtcGxveWVlXFwncyBtb3N0IHJlY2VudCBwYXlzdHViIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGxhc3RfcGF5c3R1Yl9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfT1dORVJTOiBBc3NldE93bmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0hPTERFUjogQXNzZXRIb2xkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05TOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZhbGlkYXRpb25Tb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nLi4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFVEFJTDogQXNzZXRUcmFuc2FjdGlvbkRldGFpbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTjogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRzIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIEZpcnN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTWlkZGxlTmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycztcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGxvYW4uIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBcXFwiU3ViamVjdExvYW5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMb2FuUm9sZVR5cGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PExvYW5JZGVudGlmaWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogQXJyYXk8TG9hbklkZW50aWZpZXI+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbG9hbnMgdGhhdCBhcmUgcGFydCBvZiBhIHNpbmdsZSBkZWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zXG4gICAgICovXG4gICAgTE9BTjogQ3JlZGl0RnJlZGRpZU1hY0xvYW47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGFydHkgdG8gYSB0cmFuc2FjdGlvbi4gSW5jbHVkZWQgZGlyZWN0IHBhcnRpY2lwYW50cyBsaWtlIHRoZSBib3Jyb3dlciBhbmQgc2VsbGVyIGFzIHdlbGwgYXMgaW5kaXJlY3QgcGFydGljaXBhbnRzIHN1Y2ggYXMgdGhlIGZsb29kIGNlcnRpZmljYXRlIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gICAgICovXG4gICAgUk9MRVM6IFJvbGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbFxuICAgICAqL1xuICAgIE5BTUU6IENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydERhdGVUaW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJSZXBvcnRJRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRJZGVudGlmaWVyVHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25QYXJlbnRJZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXI6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChWT0EpIHNjaGVtYSB2ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdGF0dXNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBTVEFUVVNFUzogU3RhdHVzZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVzY3JpYmUgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBmb3Igc2VydmljZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAgICAgKi9cbiAgICBTRVJWSUNFOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFNFUlZJQ0VfUFJPRFVDVF9GVUxGSUxMTUVOVDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjQXNzZXRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIHNjaGVtYS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBMT0FOUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydGllc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFBBUlRJRVM6IENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBTRVJWSUNFUzogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVuZCB1c2VyXFwncyBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhOiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogQ3JlZGl0UGF5U3R1YkVhcm5pbmdzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogQ3JlZGl0UGF5U3R1YkVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0UGF5U3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViTmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgbmV0X3BheTogQ3JlZGl0UGF5U3R1Yk5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YlBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM6IFBheVN0dWJQYXlQZXJpb2REZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkRlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogUGF5U3R1YkRlZHVjdGlvbnNUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5IHN0dWIgYW5kIHRoZSB0b3RhbCBlYXJuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViRWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJFYXJuaW5nc1RvdGFsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgU0lOR0xFYCBvciBgTUFSUklFRGAgb3IgYE5PVCBMSVNURURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViVGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ6IFBheVN0dWJUYXhwYXllcklEO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzczogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgbmV0IHBheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGV4cGxpY2l0IHBheSBiYXNpcyBvbiB0aGUgcGF5c3R1YiAoaWYgcHJlc2VudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlIHtcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBIb3VybHkgPSAnSE9VUkxZJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nXG59XG5cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIHdob3NlIHBheXJvbGwgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBib2R5IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PFBheXJvbGxJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2RvY3VtZW50cy91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZG9jdW1lbnRzL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyBiZWxvbmdpbmcgdG8gdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoZSBJdGVtcyBzcGVjaWZpZWQgaGVyZSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgcHJvdmlkaW5nIHRoZW0gaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIHRoZXNlIEl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggKGFuZCBiaWxsZWQgZm9yKSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luc3RpdHV0aW9uPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlkZW5jZTogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB0byBiZSByZWZyZXNoZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHdoZXJlIFBsYWlkIHdpbGwgc2VuZCB0aGUgcGF5cm9sbCBpbmNvbWUgcmVmcmVzaCB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJVU0VSX1BSRVNFTkNFX1JFUVVJUkVEXFxcImAgVXNlciBwcmVzZW5jZSBpcyByZXF1aXJlZCB0byByZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb24uIGBcXFwiU1VDQ0VTU0ZVTFxcXCJgIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggd2FzIHN1Y2Nlc3NmdWwuIGBcXFwiTk9UX0ZPVU5EXFxcImAgTm8gbmV3IGRhdGEgd2FzIGZvdW5kIGFmdGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yZWZyZXNoX3N0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbFJpc2tTaWduYWxzSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgZW1wbG95ZWVfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcG9zaXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiByZXBvcnQgdG9rZW4gc3RyaW5ncywgd2l0aCBhdCBtb3N0IG9uZSB0b2tlbiBvZiBlYWNoIHJlcG9ydCB0eXBlLiBDdXJyZW50bHkgb25seSBBc3NldCBSZXBvcnQgdG9rZW4gaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2Vjb25kYXJ5X2NsaWVudF9pZGAgaXMgdGhlIGNsaWVudCBpZCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSByZWxheSB0b2tlbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCB3ZWJob29rcyB3aGVuIHRoZSBTZWNvbmRhcnkgQ2xpZW50IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSB0byBhbGxvdyB0aGVtIHRvIGFjY2VzcyB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgeW91IHdvdWxkIGxpa2UgdG8gcmV2b2tlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIHJlbGF5IHRva2VuIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFuZCByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgcmV0dXJuZWQgaW4gdGhlIG9uU3VjY2Vzcy9vbkV4aXQgY2FsbGJhY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTGluayBzZXNzaW9uIHN0YXJ0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgc2Vzc2lvbl9zdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uUmVzdWx0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBDcmVkaXRTZXNzaW9uUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgZW1wbG95bWVudC4gIGBOT19FTVBMT1lNRU5UU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGVtcGxveW1lbnQgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYEVNUExPWUVSX05PVF9MSVNURURgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZGlkIG5vdCBzZWUgdGhlaXIgY3VycmVudCBvciBwcmV2aW91cyBlbXBsb3llciBpbiB0aGUgbGlzdCBvZiBlbXBsb3llciBuYW1lcyBmb3VuZC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9FbXBsb3llcnNGb3VuZCA9ICdOT19FTVBMT1lFUlNfRk9VTkQnLFxuICAgIEVtcGxveWVyTm90TGlzdGVkID0gJ0VNUExPWUVSX05PVF9MSVNURUQnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgSW5jb21lIExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBpbmNvbWUgIGBOT19ERVBPU0lUU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgVVNFUl9SRVBPUlRFRF9OT19JTkNPTUVgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZG9uXFwndCByZWNlaXZlIGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgU1RBUlRFRGA6IFRoZSB1c2VyIGJlZ2FuIHRoZSBiYW5rIGluY29tZSBwb3J0aW9uIG9mIHRoZSBsaW5rIGZsb3cuICBgSU5URVJOQUxfRVJST1JgOiBUaGUgdXNlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9EZXBvc2l0c0ZvdW5kID0gJ05PX0RFUE9TSVRTX0ZPVU5EJyxcbiAgICBVc2VyUmVwb3J0ZWROb0luY29tZSA9ICdVU0VSX1JFUE9SVEVEX05PX0lOQ09NRSdcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIDEwOTlzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtXzEwOTlzX3VwbG9hZGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgTGluayBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yIHtcbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5lZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHcycyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEluc3RpdHV0aW9uIE5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNldCBvZiByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBpdGVtX2FkZF9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWVfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGRvY3VtZW50X2luY29tZV9yZXN1bHRzPzogQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIGZvciB0aGUgdXNlci4gU2Vzc2lvbnMgd2lsbCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlc3Npb25zPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0VzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCB5ZWFyIG9mIHRoZSBXMiBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRheF95ZWFyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIG1lZGljYXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfd2FnZXNfYW5kX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlZCB0aXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYWxsb2NhdGVkX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfOTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5vbnF1YWxpZmllZCBwbGFucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG5vbnF1YWxpZmllZF9wbGFuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94XzEyOiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgcmV0aXJlbWVudF9wbGFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXRlX2FuZF9sb2NhbF93YWdlczogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0LiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHRpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdGVkIGxpa2VsaWhvb2QgdGhhdCB0aGUgdHJhbnNhY3Rpb24sIGlmIGluaXRpYXRlZCwgd2lsbCBiZSBzdWJqZWN0IHRvIGEgcmV0dXJuLiAgSW4gdGhlIGBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGZpdmUgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAwJSAtIDAuMDIlICAgMjogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAyJSAtIDAuMDUlICAgMzogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjA1JSAtIDAuMSUgICA0OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMSUgLSAwLjUlICAgNTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDAuNSUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIEFjY291bnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgdGVhbSBtZW1iZXIgd2l0aCBhY2Nlc3MgdG8gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXIge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBkYXNoYm9hcmQgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBEYXNoYm9hcmRVc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGRhc2hib2FyZCB1c2Vyc1xuICAgICAqIEB0eXBlIHtBcnJheTxEYXNoYm9hcmRVc2VyPn1cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyczogQXJyYXk8RGFzaGJvYXJkVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRGFzaGJvYXJkVXNlclN0YXR1cyB7XG4gICAgSW52aXRlZCA9ICdpbnZpdGVkJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBEZWFjdGl2YXRlZCA9ICdkZWFjdGl2YXRlZCdcbn1cblxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBzb3VyY2Ugb2YgZGF0YSBmb3IgYSBnaXZlbiBwcm9kdWN0L2RhdGEgdHlwZS4gIGBJTlNUSVRVVElPTmA6IFRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyB0aGlzIHByb2R1Y3QsIGFuZCB0aGUgZGF0YSB3YXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBgSU5TVElUVVRJT05fTUFTS2A6IFRoZSB1c2VyIG1hbnVhbGx5IHByb3ZpZGVkIHRoZSBmdWxsIGFjY291bnQgbnVtYmVyLCB3aGljaCB3YXMgbWF0Y2hlZCB0byB0aGUgYWNjb3VudCBtYXNrIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gT25seSBhcHBsaWNhYmxlIHRvIHRoZSBgbnVtYmVyc2AgZGF0YSB0eXBlLiBgVVNFUmA6IFRoZSBpbnN0aXR1dGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgcHJvZHVjdCwgYW5kIHRoZSBkYXRhIHdhcyBtYW51YWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERhdGFTb3VyY2VzIHtcbiAgICBJbnN0aXR1dGlvbiA9ICdJTlNUSVRVVElPTicsXG4gICAgSW5zdGl0dXRpb25NYXNrID0gJ0lOU1RJVFVUSU9OX01BU0snLFxuICAgIFVzZXIgPSAnVVNFUidcbn1cblxuLyoqXG4gKiBBIGRhdGUgcmFuZ2Ugd2l0aCBhIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXRlUmFuZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBiZWdpbm5pbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGF0ZVJhbmdlXG4gICAgICovXG4gICAgZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8RGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlIGZvciBhbiBJdGVtLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSB0aGUgd2ViaG9vayByZWxhdGVzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIFRoZSB1c2VyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIChEZXByZWNhdGVkKSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnR9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdGFyZ2V0X3VzZXI6IERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgSXRlbSwgdHlwaWNhbGx5IHByb3ZpZGVkIGluIHRoZSBJbXBvcnQgSXRlbSByZXNwb25zZS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWQgQWNjb3VudCBJRCB0aGF0IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGJhbmsgYWNjb3VudC4gVGhpcyBhY2NvdW50IHdpbGwgYmVjb21lIHRoZSByZWNpcGllbnQgZm9yIGEgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbiBpdGVtcyB0byB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSB1c2VyIHRvIHRoZWlyIFBheXJvbGwgUHJvdmlkZXIuIFRoZXNlIHRva2VucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIHNhbWUgY2xpZW50IGlkIGFzIHRoZSBvbmUgY3JlYXRpbmcgdGhlIHN3aXRjaCwgYW5kIGhhdmUgYWNjZXNzIHRvIHRoZSB0cmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faXRlbV9hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFxcXCJERVBPU0lUX1NXSVRDSFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgXFxcIlNXSVRDSF9TVEFURV9VUERBVEVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogIFRoZSBzdGF0ZSwgb3Igc3RhdHVzLCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guICBgaW5pdGlhbGl6ZWRgOiBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgYHByb2Nlc3NpbmdgOiBUaGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgYmVlbiBzdWJtaXR0ZWQgYW5kIGlzIGJlaW5nIHByb2Nlc3NlZC4gIGBjb21wbGV0ZWRgOiBUaGUgdXNlclxcJ3MgZW1wbG95ZXIgaGFzIGZ1bGZpbGxlZCBhbmQgY29tcGxldGVkIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgYGVycm9yYDogVGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbRGVwb3NpdCBTd2l0Y2ggQVBJIHJlZmVyZW5jZV0oL2RvY3MvZGVwb3NpdC1zd2l0Y2gvcmVmZXJlbmNlI2RlcG9zaXRfc3dpdGNoZ2V0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgVGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgZm9yIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb24gYWNjb3VudCwgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyIGluIHRoZSBEZXBvc2l0IFN3aXRjaCBpbnRlcmZhY2UuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIG9ubGluZSBiYW5raW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncydcbn1cblxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgVGhlIGRlcG9zaXQgc3dpdGNoIHRhcmdldCB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBnaXZlbiBuYW1lIChmaXJzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmFtaWx5IG5hbWUgKGxhc3QgbmFtZSkgb2YgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGEgdmFyaWV0eSBvZiBwaG9uZSBudW1iZXIgZm9ybWF0cywgaW5jbHVkaW5nIEUuMTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHRheHBheWVyIElEIG9mIHRoZSB1c2VyLCBnZW5lcmFsbHkgdGhlaXIgU1NOLCBFSU4sIG9yIFRJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIHRheF9wYXllcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIERlcG9zaXQgc3dpdGNoIHRva2VuLCB1c2VkIHRvIGluaXRpYWxpemUgTGluayBmb3IgdGhlIERlcG9zaXQgU3dpdGNoIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXhwaXJhdGlvbiB0aW1lIG9mIHRoZSB0b2tlbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogT3JpZ2luYXRvciBhbmQgdGhlaXIgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIG91dHN0YW5kaW5nIHJlcXVpcmVtZW50cyBmb3Igc2NhbGVkIHBsYXRmb3JtIG9yaWdpbmF0b3JzLiBPbmx5IHBvcHVsYXRlZCB3aGVuIGB0cmFuc2Zlcl9kaWxpZ2VuY2Vfc3RhdHVzYCBpcyBgbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZGAuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD59XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX3JlcXVpcmVtZW50cz86IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD47XG59XG4vKipcbiAqIEEgcG9zc2libGUgYWNjb3VudCBkZXRlY3RlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRlY3RlZEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RlZEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBhY2NvdW50IHR5cGUgKGRlcG9zaXRvcnksIGNyZWRpdCwgbG9hbiwgaW52ZXN0bWVudCBldGMuKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbnMgdG8vZnJvbSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogRGV2aWNlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBsaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV2aWNlSWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VJZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV2aWNlSWRcbiAgICAgKi9cbiAgICB0eXBlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBkZXZpY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXZpY2VJZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBET0NVTUVOVF9UWVBFX1BBWVNUVUJgOiBBIHBheXN0dWIuICBgRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX0dJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYERPQ1VNRU5UX1RZUEVfTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jVHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEb2N1bWVudFR5cGVQYXlzdHViID0gJ0RPQ1VNRU5UX1RZUEVfUEFZU1RVQicsXG4gICAgRG9jdW1lbnRUeXBlQmFua1N0YXRlbWVudCA9ICdET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheFcyID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5RXJhcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlMZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlDbGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFUycsXG4gICAgRG9jdW1lbnRUeXBlR2lnID0gJ0RPQ1VNRU5UX1RZUEVfR0lHJyxcbiAgICBEb2N1bWVudFR5cGVOb25lID0gJ0RPQ1VNRU5UX1RZUEVfTk9ORScsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5TWlzYyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X01JU0MnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OUsgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9LJyxcbiAgICBEb2N1bWVudFR5cGVQbGFpZEdlbmVyYXRlZFBheXN0dWJQZGYgPSAnRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREYnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbmFseXNpc0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBmcmF1ZF9hbmFseXNpc19kZXRhaWxzPzogRnJhdWRBbmFseXNpc0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbWFnZVF1YWxpdHlEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudEFuYWx5c2lzXG4gICAgICovXG4gICAgaW1hZ2VfcXVhbGl0eV9kZXRhaWxzPzogSW1hZ2VRdWFsaXR5RGV0YWlscyB8IG51bGw7XG59XG4vKipcbiAqIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB3aGV0aGVyIHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UgbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBhbmQgc2VjdXJpdHkgY2hlY2tzIGZvciB0aGUgYXNzb2NpYXRlZCBqdXJpc2RpY3Rpb24uICBGb3IgZXhhbXBsZSwgbW9zdCBpZGVudGl0eSBkb2N1bWVudHMgaGF2ZSBmb3JtYXR0aW5nIHJ1bGVzIGxpa2UgdGhlIGZvbGxvd2luZzogICBUaGUgaW1hZ2Ugb2YgdGhlIHBlcnNvblxcJ3MgZmFjZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGNvbnRyYXN0IGluIG9yZGVyIHRvIGhpZ2hsaWdodCBza2luIHRvbmUgICBUaGUgc3ViamVjdCBpbiB0aGUgZG9jdW1lbnRcXCdzIGltYWdlIG11c3QgcmVtb3ZlIGV5ZSBnbGFzc2VzIGFuZCBwb3NlIGluIGEgY2VydGFpbiB3YXkgICBUaGUgaW5mb3JtYXRpb25hbCBmaWVsZHMgKG5hbWUsIGRhdGUgb2YgYmlydGgsIElEIG51bWJlciwgZXRjLikgbXVzdCBiZSBjb2xvcmVkIGFuZCBhbGlnbmVkIGFjY29yZGluZyB0byBzcGVjaWZpYyBydWxlcyAgIFNlY3VyaXR5IGZlYXR1cmVzIGxpa2Ugd2F0ZXJtYXJrcyBhbmQgYmFja2dyb3VuZCBwYXR0ZXJucyBtdXN0IGJlIHByZXNlbnQgIFNvIGEgYG1hdGNoYCBzdGF0dXMgZm9yIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBzZWVtcyB0byBjb25mb3JtIHRvIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgYW5kIHNlY3VyaXR5IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBkYXRlIG9mIGJpcnRoLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgZGF0ZSBvZiBiaXJ0aCB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY190eXBlPzogRG9jVHlwZTtcbn1cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgbmFtZSwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIG5hbWUgdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnROYW1lTWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBjZXJ0YWluIHJlYXNvbiBhcyB0byB3aHkgYSBkb2N1bWVudCBjb3VsZCBwb3RlbnRpYWxseSBiZSBmcmF1ZHVsZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHJpc2sgZm91bmQgaW4gdGhlIHJpc2sgc2lnbmFsIGNoZWNrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIHdoaWNoIHRoZSByaXNrIHNpZ25hbCB3YXMgY29tcHV0ZWQgZm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZmllbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHVzZWQgdG8gcXVpY2tseSBpZGVudGlmeSBpZiB0aGUgc2lnbmFsIGluZGljYXRlcyB0aGF0IHRoaXMgZmllbGQgaXMgYXV0aGVudGljIG9yIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaGFzX2ZyYXVkX3Jpc2s6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9tZXRhZGF0YTogRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBmaWVsZCwgYXMgc2VlbiBvbiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBleHBlY3RlZF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVyaXZlZCB2YWx1ZSBvYnRhaW5lZCBpbiB0aGUgcmlzayBzaWduYWwgY2FsY3VsYXRpb24gcHJvY2VzcyBmb3IgdGhpcyBmaWVsZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGFjdHVhbF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHByb3ZpZGluZyBtb3JlIGRldGFpbCBpbnRvIHRoZSBwYXJ0aWN1bGFyIHJpc2sgc2lnbmFsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgc2lnbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWxldmFudCBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlzayBzaWduYWwuIElmIHRoZSByaXNrIHNpZ25hbCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgcGFnZSwgdGhlIHZhbHVlIHdpbGwgYmUgMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBwYWdlX251bWJlcjogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGluc3RpdHV0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmVyaWZpY2F0aW9uIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBmb3IgYSBzZXQgb2YgaW5jb21lIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnQgbWV0YWRhdGEgYW5kIGFzc29jaWF0ZWQgcmlzayBzaWduYWxzIHBlciBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxTaW5nbGVEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgc2luZ2xlX2RvY3VtZW50X3Jpc2tfc2lnbmFsczogQXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByaXNrIHNpZ25hbHMgY29tcHV0ZWQgZnJvbSBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHMgYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50c1xcJyBtZXRhZGF0YVxuICAgICAqIEB0eXBlIHtBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBtdWx0aV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogQSBzdW1tYXJ5IGFjcm9zcyBhbGwgcmlzayBzaWduYWxzIGFzc29jaWF0ZWQgd2l0aCBhIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1N1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCwgaW5jbHVzaXZlLCB3aGVyZSBhIHNjb3JlIGNsb3NlciB0byAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSB0cnVzdHdvcnRoeSBhbmQgYSBzY29yZSBjbG9zZXIgdG8gMTAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSBmcmF1ZHVsZW50LiBZb3UgY2FuIGF1dG9tYXRpY2FsbHkgcmVqZWN0IGRvY3VtZW50cyB3aXRoIGEgaGlnaCByaXNrIHNjb3JlLCBhdXRvbWF0aWNhbGx5IGFjY2VwdCBkb2N1bWVudHMgd2l0aCBhIGxvdyByaXNrIHNjb3JlLCBhbmQgbWFudWFsbHkgcmV2aWV3IGRvY3VtZW50cyBpbiBiZXR3ZWVuLiBXZSBzdWdnZXN0IHN0YXJ0aW5nIHdpdGggYSB0aHJlc2hvbGQgb2YgODAgZm9yIGF1dG8tcmVqZWN0aW9uIGFuZCAyMCBmb3IgYXV0by1hY2NlcHRhbmNlLiBBcyB5b3UgZ2F0aGVyIG1vcmUgZGF0YSBwb2ludHMgb24gdHlwaWNhbCByaXNrIHNjb3JlcyBmb3IgeW91ciB1c2UgY2FzZSwgeW91IGNhbiB0dW5lIHRoZXNlIHBhcmFtZXRlcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHVuZGVyZ29pbmcgbWFudWFsIHJldmlldy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19zY29yZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgZG9jdW1lbnQgc3VibWlzc2lvbi4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnXG59XG5cbi8qKlxuICogRGF0YSwgaW1hZ2VzLCBhbmFseXNpcywgYW5kIHJlc3VsdHMgZnJvbSB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkb2N1bWVudHMgc3VibWl0dGVkIHRvIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbiwgd2hlcmUgZWFjaCBzdWJtaXNzaW9uIHdpbGwgY29udGFpbiBib3RoIGEgZnJvbnQgYW5kIGJhY2sgaW1hZ2UsIG9yIGp1c3QgYSBmcm9udCBpbWFnZSwgZGVwZW5kaW5nIG9uIHRoZSBkb2N1bWVudCB0eXBlLiAgTm90ZTogUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGxldCBhIHVzZXIgc3VibWl0IGEgbmV3IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgdXAgdG8gdGhyZWUgdGltZXMgaWYgd2UgZGV0ZWN0IHRoYXQgYSBwcmV2aW91cyBhdHRlbXB0IG1pZ2h0IGhhdmUgZmFpbGVkIGR1ZSB0byB1c2VyIGVycm9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgYXJlIGJsdXJyeSBvciBvYnNjdXJlZCBieSBnbGFyZSwgdGhlIHVzZXIgd2lsbCBiZSBhc2tlZCB0byBjYXB0dXJlIHRoZWlyIGRvY3VtZW50cyBhZ2FpbiwgcmVzdWx0aW5nIGluIGF0IGxlYXN0IHR3byBzZXBhcmF0ZSBlbnRyaWVzIHdpdGhpbiBgZG9jdW1lbnRzYC4gSWYgdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaXMgYGZhaWxlZGAsIHRoZSB1c2VyIGhhcyBleGhhdXN0ZWQgdGhlaXIgcmV0cnkgYXR0ZW1wdHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRvY3VtZW50czogQXJyYXk8RG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudD47XG59XG4vKipcbiAqIEltYWdlcywgZXh0cmFjdGVkIGRhdGEsIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3MgaWRlbnRpdHkgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogRG9jdW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IGRvY3VtZW50IHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50SW1hZ2VzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgaW1hZ2VzOiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBhbmFseXNpczogRG9jdW1lbnRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8RWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgQmFzaWNBbGxvd2FuY2VIb3VzaW5nID0gJ0JBU0lDIEFMTE9XQU5DRSBIT1VTSU5HJyxcbiAgICBCYXNpY0FsbG93YW5jZVN1YnNpc3RlbmNlID0gJ0JBU0lDIEFMTE9XQU5DRSBTVUJTSVNURU5DRScsXG4gICAgT3RoZXIgPSAnT1RIRVInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbWFpbCBhZGRyZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGVtYWlsIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBlbWFpbCBhY2NvdW50IGFzIGRlc2NyaWJlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgdHlwZTogRW1haWxUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBFbWFpbFR5cGVFbnVtIHtcbiAgICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxuICAgIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGVtYWlsIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgZW1haWwgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIGVtYWlsLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoLCA5OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2ggKG1hdGNoaW5nIHRoZSBzYW1lIGVtYWlsIHdpdGggZGlmZmVyZW50IFxcJytcXCcgZXh0ZW5zaW9ucyksIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBlbWFpbCBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgc2luZ2xlYCBvciBgbWFycmllZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ/OiBUYXhwYXllcklEO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBBZGRyZXNzRGF0YU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBmcm9tIDAgdG8gMSBpbmRpY2F0aW5nIFBsYWlkXFwncyBsZXZlbCBvZiBjb25maWRlbmNlIGluIHRoZSBwYWlyaW5nIGJldHdlZW4gdGhlIGVtcGxveWVyIGFuZCB0aGUgaW5zdGl0dXRpb24gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgY29uZmlkZW5jZV9zY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBuYW1lIHRvIGJlIHNlYXJjaGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgcHJvZHVjdHMgdGhlIHJldHVybmVkIGVtcGxveWVycyBzaG91bGQgc3VwcG9ydC4gQ3VycmVudGx5LCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGBcXFwiZGVwb3NpdF9zd2l0Y2hcXFwiYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3llcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyczogQXJyYXk8RW1wbG95ZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBlbXBsb3ltZW50IGRldGFpbHMgZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYW5udWFsX3NhbGFyeT86IFBheTtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9uIHdoaWNoIHRoZSBlbXBsb3llZSB3YXMgaGlyZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGhpcmVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRTb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWxcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzPzogRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgb2YgZW1wbG95bWVudCwgaWYgYXBwbGljYWJsZS4gUHJvdmlkZWQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYXRmb3JtSWRzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGxhdGZvcm1faWRzPzogUGxhdGZvcm1JZHM7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIHN1bW1hcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRzOiBBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgRW1wbG95bWVudFN0YXR1c0FjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19BQ1RJVkUnLFxuICAgIEVtcGxveW1lbnRTdGF0dXNJbmFjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19JTkFDVElWRScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVuaGFuY2VtZW50IGZpZWxkcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxDb3VudGVycGFydHk+O1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYWNjb3VudCBob2xkZXI6ICBgT1VURkxPV2AgLSBJbmNsdWRlcyBvdXRnb2luZyB0cmFuc2ZlcnMsIHB1cmNoYXNlcywgYW5kIGZlZXMuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgcG9zaXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLikgIGBJTkZMT1dgIC0gSW5jbHVkZXMgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzLCBhbmQgaW5jb21lLiAoVHlwaWNhbGx5IHJlcHJlc2VudGVkIGFzIGEgcG9zaXRpdmUgdmFsdWUgb24gY2hlY2tpbmcgYWNjb3VudHMgYW5kIGRlYml0IGNhcmRzIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNyZWRpdCBjYXJkcy4pXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbiB7XG4gICAgSW5mbG93ID0gJ0lORkxPVycsXG4gICAgT3V0ZmxvdyA9ICdPVVRGTE9XJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVucmljaG1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnJpY2htZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVucmljaG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllczogQXJyYXk8Q291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBsZWdhY3kgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxlZ2FjeV9jYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGxlZ2FjeSBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgZm9yIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHRvIG9idGFpbiB0aGUgYmVzdCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENoYW5uZWx9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5IGluIEUuIDE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICByZWN1cnJlbmNlPzogUmVjdXJyZW5jZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eURvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogRW50aXR5RG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlrYCAtIFJ1c3NpYW4gYmFuayBjb2RlICBgYnVzaW5lc3NfbnVtYmVyYCAtIEEgbnVtYmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgYnVzaW5lc3Mgd2l0aGluIGEgY2F0ZWdvcnkgb2YgYnVzaW5lc3NlcyAgYGltb2AgLSBOdW1iZXIgYXNzaWduZWQgdG8gdGhlIGVudGl0eSBieSB0aGUgSW50ZXJuYXRpb25hbCBNYXJpdGltZSBPcmdhbml6YXRpb24gIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHN3aWZ0YCAtIE51bWJlciBpZGVudGlmeWluZyBhIGJhbmsgYW5kIGJyYW5jaC4gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlEb2N1bWVudFR5cGUge1xuICAgIEJpayA9ICdiaWsnLFxuICAgIEJ1c2luZXNzTnVtYmVyID0gJ2J1c2luZXNzX251bWJlcicsXG4gICAgSW1vID0gJ2ltbycsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFN3aWZ0ID0gJ3N3aWZ0JyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnXG59XG5cbi8qKlxuICogQW5hbHlzaXMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aHkgYSBzY3JlZW5pbmcgaGl0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIGVudGl0eSBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVycz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgdXJscz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIGVudGl0eSBzY3JlZW5pbmcgaGl0cyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhleSBoYXZlIGJlZW4gcmV2aWV3ZWQuIElmIGNoYW5nZXMgYXJlIGRldGVjdGVkIGR1ZSB0byB1cGRhdGVzIHRvIHRoZSBlbnRpdHkgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zX3ZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICB1cmxzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnRzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eURvY3VtZW50O1xufVxuLyoqXG4gKiBFbWFpbCBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHMge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJscyB7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW50aXR5X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGVudGl0aWVzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX1NPRWA6IFN0YXRlIE93bmVkIEVudGVycHJpc2UgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVU19DQVBgOiBVUyBPRkFDIENvcnJlc3BvbmRlbnQgQWNjb3VudCBvciBQYXlhYmxlLVRocm91Z2ggQWNjb3VudCBTYW5jdGlvbnMgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19NQlNgOiBVUyBOb24tU0ROIE1lbnUtQmFzZWQgU2FuY3Rpb25zICBgVVNfU0ROYDogVVMgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmF0aW9uYWxzIExpc3QgIGBVU19TU0lgOiBVUyBPRkFDIFNlY3RvcmFsIFNhbmN0aW9ucyBJZGVudGlmaWNhdGlvbnMgIGBVU19DTUNgOiBVUyBPRkFDIE5vbi1TRE4gQ2hpbmVzZSBNaWxpdGFyeS1JbmR1c3RyaWFsIENvbXBsZXggTGlzdCAgYFVTX1VWTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgVW52ZXJpZmllZCBMaXN0ICBgVUtfSE1DYDogVUsgSE0gVHJlYXN1cnkgQ29uc29saWRhdGVkIExpc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eVdhdGNobGlzdENvZGUge1xuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJelNvZSA9ICdJWl9TT0UnLFxuICAgIEl6VW5jID0gJ0laX1VOQycsXG4gICAgSXpXYmsgPSAnSVpfV0JLJyxcbiAgICBVc0NhcCA9ICdVU19DQVAnLFxuICAgIFVzRnNlID0gJ1VTX0ZTRScsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1NkbiA9ICdVU19TRE4nLFxuICAgIFVzU3NpID0gJ1VTX1NTSScsXG4gICAgVXNDbWMgPSAnVVNfQ01DJyxcbiAgICBVc1V2bCA9ICdVU19VVkwnLFxuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgVWtIbWMgPSAnVUtfSE1DJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogRW50aXR5V2F0Y2hsaXN0Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXZlcnNhbCBpZGVudGlmaWVyIGZvciBhIHdhdGNobGlzdCBpbmRpdmlkdWFsIHRoYXQgaXMgc3RhYmxlIGFjcm9zcyBzZWFyY2hlcyBhbmQgdXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBwbGFpZF91aWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc291cmNlIHNhbmN0aW9uIG9yIHdhdGNobGlzdC4gV2hlbiBvbmUgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHNvdXJjZV91aWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0RGF0YTtcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgdXNlZCBmb3Igc2VhcmNoaW5nIGFnYWluc3Qgd2F0Y2hsaXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24gYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2Ygd2hldGhlciB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudCB3YXMgZXhwaXJlZCB3aGVuIHRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZC4gIE5vdGU6IEluIHRoZSBjYXNlIHdoZXJlIGFuIGV4cGlyYXRpb24gZGF0ZSBpcyBub3QgcHJlc2VudCBvbiB0aGUgZG9jdW1lbnQgb3IgZmFpbGVkIHRvIGJlIGV4dHJhY3RlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEV4cGlyYXRpb25EYXRlIHtcbiAgICBOb3RFeHBpcmVkID0gJ25vdF9leHBpcmVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFBsYWlkIGFuZCBGRFgtZGVmaW5lZCByZWNpcGllbnQgbWV0YWRhdGEgZmllbGRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBuYW1lIGRpc3BsYXllZCBieSB0aGUgRGF0YSBQcm92aWRlciBkdXJpbmcgdGhlIGNvbnNlbnQgZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X2xlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggdGhlIHJlY2lwaWVudCBnYWluZWQgcHJvZHVjdGlvbiBhY2Nlc3MgdG8gUGxhaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgam9pbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIERhdGEgUGFydG5lciBjb25zdW1lcnMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSByZWNpcGllbnQgZm9yIHRoZSBzcGVjaWZpYyBEYXRhIFBhcnRuZXJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCB0aGUgcmVjaXBpZW50IGdhaW5lZCBwcm9kdWN0aW9uIGFjY2VzcyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFBbGxPZlxuICAgICAqL1xuICAgIGpvaW5lZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBEYXRhIFBhcnRuZXIgY29uc3VtZXJzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgcmVjaXBpZW50IGZvciB0aGUgc3BlY2lmaWMgRGF0YSBQYXJ0bmVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9ucy4gUGxlYXNlIHVzZSBgcGF5ZXJfZGV0YWlsc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGV4dGVybmFsIHBheW1lbnQgcmVmdW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGJhY3M6IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbD86IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFR5cGVzIG9mIGRvY3VtZW50IGZvcm1hdHMuIChTdWdnZXN0ZWQgdmFsdWVzKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYQ29udGVudFR5cGVzIHtcbiAgICBBcHBsaWNhdGlvblBkZiA9ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgIEltYWdlR2lmID0gJ2ltYWdlL2dpZicsXG4gICAgSW1hZ2VKcGVnID0gJ2ltYWdlL2pwZWcnLFxuICAgIEltYWdlVGlmZiA9ICdpbWFnZS90aWZmJyxcbiAgICBJbWFnZVBuZyA9ICdpbWFnZS9wbmcnLFxuICAgIEFwcGxpY2F0aW9uSnNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJ1xufVxuXG4vKipcbiAqIEZpbmFuY2lhbCBJbnN0aXR1dGlvbiBwcm92aWRlci1zcGVjaWZpYyBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYRmlBdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBhdHRyaWJ1dGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhdHRyaWJ1dGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG4vKipcbiAqIFJFU1QgYXBwbGljYXRpb24gY29uc3RyYWludCAoSHlwZXJtZWRpYSBBcyBUaGUgRW5naW5lIE9mIEFwcGxpY2F0aW9uIFN0YXRlKVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhIYXRlb2FzTGlua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rIHtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gaW52b2tlIHRoZSBhY3Rpb24gb24gdGhlIHJlc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICBocmVmOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rQWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGFjdGlvbj86IEZEWEhhdGVvYXNMaW5rQWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFJlbGF0aW9uIG9mIHRoaXMgbGluayB0byBpdHMgY29udGFpbmluZyBlbnRpdHksIGFzIGRlZmluZWQgYnkgYW5kIHdpdGggbWFueSBleGFtcGxlIHJlbGF0aW9uIHZhbHVlcyBhdCBbSUVURiBSRkM1OTg4XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzU5ODgpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICByZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29udGVudC10eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICogQHR5cGUge0FycmF5PEZEWENvbnRlbnRUeXBlcz59XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgdHlwZXM/OiBBcnJheTxGRFhDb250ZW50VHlwZXM+O1xufVxuLyoqXG4gKiBIVFRQIE1ldGhvZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhIYXRlb2FzTGlua0FjdGlvbiB7XG4gICAgR2V0ID0gJ0dFVCcsXG4gICAgUG9zdCA9ICdQT1NUJyxcbiAgICBQYXRjaCA9ICdQQVRDSCcsXG4gICAgRGVsZXRlID0gJ0RFTEVURScsXG4gICAgUHV0ID0gJ1BVVCdcbn1cblxuLyoqXG4gKiBJbml0aWF0b3IgRmkgQXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlPzogRkRYUGFydHlUeXBlO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgYmFzZSBmaWVsZHMgb2YgYSBub3RpZmljYXRpb24uIENsaWVudHMgd2lsbCByZWFkIHRoZSBgdHlwZWAgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBub3RpZmljYXRpb24gcGF5bG9hZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIElkIG9mIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEZEWE5vdGlmaWNhdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogSVNPIDg2MDEgZGF0ZS10aW1lIGluIGZvcm1hdCBcXCdZWVlZLU1NLUREVGhoOm1tOnNzLm5ubltafFsrfC1daGg6bW1dXFwnIGFjY29yZGluZyB0byBbSUVURiBSRkMzMzM5XShodHRwczovL3htbDJyZmMudG9vbHMuaWV0Zi5vcmcvcHVibGljL3JmYy9odG1sL3JmYzMzMzkuaHRtbCNhbmNob3IxNClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZW50T246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBGRFhOb3RpZmljYXRpb25DYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uU2V2ZXJpdHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHNldmVyaXR5PzogRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblByaW9yaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmlvcml0eT86IEZEWE5vdGlmaWNhdGlvblByaW9yaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHVibGlzaGVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdWJzY3JpYmVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblBheWxvYWR9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvblBheWxvYWQ6IEZEWE5vdGlmaWNhdGlvblBheWxvYWQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBGRFhIYXRlb2FzTGluaztcbn1cbi8qKlxuICogQ2F0ZWdvcnkgb2YgTm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25DYXRlZ29yeSB7XG4gICAgU2VjdXJpdHkgPSAnU0VDVVJJVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBGcmF1ZCA9ICdGUkFVRCcsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJyxcbiAgICBOZXdEYXRhID0gJ05FV19EQVRBJ1xufVxuXG4vKipcbiAqIEN1c3RvbSBrZXktdmFsdWUgcGFpcnMgcGF5bG9hZCBmb3IgYSBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIElEIGZvciB0aGUgb3JpZ2luYXRpb24gZW50aXR5IHJlbGF0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkVHlwZT86IEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEZEWEZpQXR0cmlidXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGN1c3RvbUZpZWxkcz86IEFycmF5PEZEWEZpQXR0cmlidXRlPjtcbn1cbi8qKlxuICogVHlwZSBvZiBlbnRpdHkgY2F1c2luZyBvcmlnaW5hdGlvbiBvZiBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZSB7XG4gICAgQWNjb3VudCA9ICdBQ0NPVU5UJyxcbiAgICBDdXN0b21lciA9ICdDVVNUT01FUicsXG4gICAgUGFydHkgPSAnUEFSVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogUHJpb3JpdHkgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25Qcmlvcml0eSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBNZWRpdW0gPSAnTUVESVVNJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFNldmVyaXR5IGxldmVsIG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHkge1xuICAgIEVtZXJnZW5jeSA9ICdFTUVSR0VOQ1knLFxuICAgIEFsZXJ0ID0gJ0FMRVJUJyxcbiAgICBXYXJuaW5nID0gJ1dBUk5JTkcnLFxuICAgIE5vdGljZSA9ICdOT1RJQ0UnLFxuICAgIEluZm8gPSAnSU5GTydcbn1cblxuLyoqXG4gKiBUeXBlIG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uVHlwZSB7XG4gICAgQ29uc2VudFJldm9rZWQgPSAnQ09OU0VOVF9SRVZPS0VEJyxcbiAgICBDb25zZW50VXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnLFxuICAgIEN1c3RvbSA9ICdDVVNUT00nLFxuICAgIFNlcnZpY2UgPSAnU0VSVklDRScsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBQbGFubmVkT3V0YWdlID0gJ1BMQU5ORURfT1VUQUdFJ1xufVxuXG4vKipcbiAqIEZEWCBQYXJ0aWNpcGFudCAtIGFuIGVudGl0eSBvciBwZXJzb24gdGhhdCBpcyBhIHBhcnQgb2YgYSBGRFggQVBJIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWFBhcnR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYUGFydHkge1xuICAgIC8qKlxuICAgICAqIEh1bWFuIHJlY29nbml6YWJsZSBjb21tb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgdHlwZTogRkRYUGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgcGFydHksIHdoZXJlIGFuIGVuZCB1c2VyIGNvdWxkIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGNvbXBhbnkgb3IgYXBwbGljYXRpb24gaW52b2x2ZWQgaW4gdGhlIGRhdGEgc2hhcmluZyBjaGFpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgaG9tZVVyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkkgZm9yIGEgbG9nbyBhc3NldCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBsb2dvVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVJlZ2lzdHJ5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdHJ5PzogRkRYUGFydHlSZWdpc3RyeTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcmVkIG5hbWUgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlOYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgaWQgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlJZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgdGhlIHBhcnR54oCZcyByZWdpc3RyYXRpb24gd2l0aCBuYW1lIGFuZCBpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYUGFydHlSZWdpc3RyeSB7XG4gICAgRmR4ID0gJ0ZEWCcsXG4gICAgR2xlaWYgPSAnR0xFSUYnLFxuICAgIEljYW5uID0gJ0lDQU5OJyxcbiAgICBQcml2YXRlID0gJ1BSSVZBVEUnXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBhIHBhcnR5XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVR5cGUge1xuICAgIERhdGFBY2Nlc3NQbGF0Zm9ybSA9ICdEQVRBX0FDQ0VTU19QTEFURk9STScsXG4gICAgRGF0YVByb3ZpZGVyID0gJ0RBVEFfUFJPVklERVInLFxuICAgIERhdGFSZWNpcGllbnQgPSAnREFUQV9SRUNJUElFTlQnLFxuICAgIEluZGl2aWR1YWwgPSAnSU5ESVZJRFVBTCcsXG4gICAgTWVyY2hhbnQgPSAnTUVSQ0hBTlQnLFxuICAgIFZlbmRvciA9ICdWRU5ET1InXG59XG5cbi8qKlxuICogUmVjaXBpZW50IG1ldGFkYXRhIGZpZWxkcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IEZEWFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgbmFtZSBkaXNwbGF5ZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgZHVyaW5nIHRoZSBjb25zZW50IGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBSZWNpcGllbnQgTG9nbyBVUkwgbG9jYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9sZWdhbF9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBpcyBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkIHVzaW5nIG1pY3JvLWRlcG9zaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWljcm8tZGVwb3NpdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBoYXMgYW4gZXhwaXJlZCB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBzdXJyb3VuZGluZyBleHRlcm5hbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlZCBhY2NvdW50cywgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIG5hdHVyZSBvZiB0cmFuc2ZlcnMgdG8vZnJvbSB0aGlzIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxEZXRlY3RlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZGV0ZWN0ZWRfYWNjb3VudHM6IEFycmF5PERldGVjdGVkQWNjb3VudD47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRml4ZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXhlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lpZWxkUmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICB5aWVsZF9yYXRlOiBZaWVsZFJhdGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXR1cml0eSBkYXRlIGZvciB0aGlzIGZpeGVkIGluY29tZSBzZWN1cml0eSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpeGVkSW5jb21lXG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaXNzdWUgZGF0ZSBmb3IgdGhpcyBmaXhlZCBpbmNvbWUgc2VjdXJpdHksIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaXhlZEluY29tZVxuICAgICAqL1xuICAgIGlzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZhY2UgdmFsdWUgdGhhdCBpcyBwYWlkIHVwb24gbWF0dXJpdHkgb2YgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eSwgcGVyIHVuaXQgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICBmYWNlX3ZhbHVlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50LiBUaGlzIGFtb3VudCByZWZsZWN0cyB0aGUgZnVuZHMgZGVwb3NpdGVkIGludG8gdGhlIGFjY291bnQgYW5kIG1heSBub3QgaW5jbHVkZSBhbnkgd2l0aGhlbGQgaW5jb21lIHN1Y2ggYXMgdGF4ZXMgb3Igb3RoZXIgcGF5cm9sbCBkZWR1Y3Rpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWNhc3RlZE1vbnRobHlJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JlY2FzdGVkIG1vbnRobHkgaW5jb21lIGF0IHRoZSB0aW1lIG9mIHN1YnNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZm9yZWNhc3RlZCBtb250aGx5IGluY29tZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogRm9ybSAxMDk5IFR5cGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZvcm0xMDk5VHlwZSB7XG4gICAgVW5rbm93biA9ICdGT1JNXzEwOTlfVFlQRV9VTktOT1dOJyxcbiAgICBNaXNjID0gJ0ZPUk1fMTA5OV9UWVBFX01JU0MnLFxuICAgIEsgPSAnRk9STV8xMDk5X1RZUEVfSydcbn1cblxuLyoqXG4gKiBBbiBhcmJpdHJhcnkgSlNPTiBwYXlsb2FkIHNlbnQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgUGxhaWQgc2VydmVyLiBJbnRlcm5hbCB1c2Ugb25seS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiB0aGUgZnJhdWQgb3IgYXR0ZW1wdGVkIGZyYXVkLiBgZnJhdWRfYW1vdW50YCBzaG91bGQgYmUgb21pdHRlZCB0byBpbmRpY2F0ZSBhbiB1bmtub3duIGZyYXVkIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogSVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIDAgdG8gaW5kaWNhdGUgbm8gbW9uZXkgd2FzIGxvc3QuIE11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIChlLmcuLCBgMS4yM2ApLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZnJhdWQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFuYWx5c2lzRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIHR5cGVfc3VwcG9ydGVkOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgcG9ydHJhaXRfcHJlc2VuY2VfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBwb3J0cmFpdF9kZXRhaWxzX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaW1hZ2VfY29tcG9zaXRpb25fY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBpbnRlZ3JpdHlfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBkZXRhaWxfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaXNzdWVfZGF0ZV9jaGVjazogRnJhdWRDaGVja091dGNvbWVXaXRoTm9EYXRhO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgZnJhdWQgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHRoZSBmcmF1ZCBjaGVjaywgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGEge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQW5hbHl6ZWQgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9ucztcbn1cbi8qKlxuICogR2V0UmVjaXBpZW50UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnQve3JlY2lwaWVudElkfWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IG5hbWUgZGlzcGxheWVkIGJ5IHRoZSBEYXRhIFByb3ZpZGVyIGR1cmluZyB0aGUgY29uc2VudCBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsb2dvX3VyaT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEdldFJlY2lwaWVudFJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfbGVnYWxfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBHZXRSZWNpcGllbnRzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8RXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YT47XG59XG4vKipcbiAqIEEgc3RhdHVzIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBoaXN0b3JpY2FsIGFubnVhbCBpbmNvbWUgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbEFubnVhbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGhpc3RvcmljYWwgYW5udWFsIGluY29tZSBhdCB0aGUgdGltZSBvZiBzdWJzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgaGlzdG9yaWNhbCBhbm51YWwgaW5jb21lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEFubnVhbEluY29tZVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdmVzdGVkIGhvbGRpbmdzIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdmVzdGVkX3ZhbHVlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgb3IgdXBkYXRlZCBob2xkaW5ncyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LiBUaGUgd2ViaG9vayB0eXBpY2FsbHkgZmlyZXMgaW4gcmVzcG9uc2UgdG8gYW55IG5ld2x5IGFkZGVkIGhvbGRpbmdzIG9yIHByaWNlIGNoYW5nZXMgdG8gZXhpc3RpbmcgaG9sZGluZ3MsIG1vc3QgY29tbW9ubHkgYWZ0ZXIgbWFya2V0IGNsb3NlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEhPTERJTkdTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdXBkYXRlZCBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVwZGF0ZWRfaG9sZGluZ3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgaG9sZGluZ3Mgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZyAoZS5nLiwgdGhlIHRvdGFsIGFtb3VudCBzcGVudCB0byBhY3F1aXJlIGFsbCBhc3NldHMgY3VycmVudGx5IGluIHRoZSBob2xkaW5nKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY29zdF9iYXNpcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk6IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEhvdyBQbGFpZCBzaG91bGQgZGVsaXZlciB0aGUgUGxhaWQgTGluayBzZXNzaW9uIHRvIHRoZSBjdXN0b21lci4gT25seSBhdmFpbGFibGUgdG8gY3VzdG9tZXJzIGVuYWJsZWQgZm9yIExpbmsgRGVsaXZlcnkgKGJldGEpLiBUbyByZXF1ZXN0IExpbmsgRGVsaXZlcnkgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBcXCdzbXNcXCcgd2lsbCBkZWxpdmVyIHZpYSBTTVMuIE11c3QgcGFzcyBgdXNlci5waG9uZV9udW1iZXJgLiBcXCdlbWFpbFxcJyB3aWxsIGRlbGl2ZXIgdmlhIGVtYWlsLiBNdXN0IHBhc3MgYHVzZXIuZW1haWxfYWRkcmVzc2AuIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgaWdub3JlZDsgdXNlIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IHRvIHRlc3QgTGluayBEZWxpdmVyeSBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ3NtcycsXG4gICAgRW1haWwgPSAnZW1haWwnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgU01TIHNhbWUtZGF5IG1pY3JvZGVwb3NpdHMgdmVyaWZpY2F0aW9uIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFsIHN0YXR1cyBvZiB0aGUgc2FtZS1kYXkgbWljcm9kZXBvc2l0cyB2ZXJpZmljYXRpb24uIFdpbGwgYWx3YXlzIGJlIGBNQU5VQUxMWV9WRVJJRklFRGAgb3IgYFZFUklGSUNBVElPTl9GQUlMRURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIGdsb2JhbGx5IHVuaXF1ZSBhbmQgaHVtYW4gcmVhZGFibGUgSUQgdHlwZSwgc3BlY2lmaWMgdG8gdGhlIGNvdW50cnkgYW5kIGRvY3VtZW50IGNhdGVnb3J5LiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSHlicmlkIElucHV0IFZhbGlkYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElETnVtYmVyVHlwZSB7XG4gICAgQXJEbmkgPSAnYXJfZG5pJyxcbiAgICBBdURyaXZlcnNMaWNlbnNlID0gJ2F1X2RyaXZlcnNfbGljZW5zZScsXG4gICAgQXVQYXNzcG9ydCA9ICdhdV9wYXNzcG9ydCcsXG4gICAgQnJDcGYgPSAnYnJfY3BmJyxcbiAgICBDYVNpbiA9ICdjYV9zaW4nLFxuICAgIENsUnVuID0gJ2NsX3J1bicsXG4gICAgQ25SZXNpZGVudENhcmQgPSAnY25fcmVzaWRlbnRfY2FyZCcsXG4gICAgQ29OaXQgPSAnY29fbml0JyxcbiAgICBEa0NwciA9ICdka19jcHInLFxuICAgIEVnTmF0aW9uYWxJZCA9ICdlZ19uYXRpb25hbF9pZCcsXG4gICAgRXNEbmkgPSAnZXNfZG5pJyxcbiAgICBFc05pZSA9ICdlc19uaWUnLFxuICAgIEhrSGtpZCA9ICdoa19oa2lkJyxcbiAgICBJblBhbiA9ICdpbl9wYW4nLFxuICAgIEl0Q2YgPSAnaXRfY2YnLFxuICAgIEpvQ2l2aWxJZCA9ICdqb19jaXZpbF9pZCcsXG4gICAgSnBNeU51bWJlciA9ICdqcF9teV9udW1iZXInLFxuICAgIEtlSHVkdW1hTmFtYmEgPSAna2VfaHVkdW1hX25hbWJhJyxcbiAgICBLd0NpdmlsSWQgPSAna3dfY2l2aWxfaWQnLFxuICAgIE14Q3VycCA9ICdteF9jdXJwJyxcbiAgICBNeFJmYyA9ICdteF9yZmMnLFxuICAgIE15TnJpYyA9ICdteV9ucmljJyxcbiAgICBOZ05pbiA9ICduZ19uaW4nLFxuICAgIE56RHJpdmVyc0xpY2Vuc2UgPSAnbnpfZHJpdmVyc19saWNlbnNlJyxcbiAgICBPbUNpdmlsSWQgPSAnb21fY2l2aWxfaWQnLFxuICAgIFBoUHNuID0gJ3BoX3BzbicsXG4gICAgUGxQZXNlbCA9ICdwbF9wZXNlbCcsXG4gICAgUm9DbnAgPSAncm9fY25wJyxcbiAgICBTYU5hdGlvbmFsSWQgPSAnc2FfbmF0aW9uYWxfaWQnLFxuICAgIFNlUGluID0gJ3NlX3BpbicsXG4gICAgU2dOcmljID0gJ3NnX25yaWMnLFxuICAgIFRyVGNLaW1saWsgPSAndHJfdGNfa2ltbGlrJyxcbiAgICBVc1NzbiA9ICd1c19zc24nLFxuICAgIFVzU3NuTGFzdDQgPSAndXNfc3NuX2xhc3RfNCcsXG4gICAgWmFTbWFydElkID0gJ3phX3NtYXJ0X2lkJ1xufVxuXG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJU09DdXJyZW5jeUNvZGUge1xuICAgIFVzZCA9ICdVU0QnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGNoYW5nZSB0byBpZGVudGl0eSBkYXRhIGhhcyBiZWVuIGRldGVjdGVkIG9uIGFuIEl0ZW0uIEl0ZW1zIGFyZSBjaGVja2VkIGZvciBpZGVudGl0eSB1cGRhdGVzIGV2ZXJ5IDMwLTkwIGRheXMuIFdlIHJlY29tbWVuZCB0aGF0IHVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vayB5b3UgbWFrZSBhbm90aGVyIGNhbGwgdG8gYC9pZGVudGl0eS9nZXRgIHRvIGZldGNoIHRoZSB1c2VyXFwncyBsYXRlc3QgaWRlbnRpdHkgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgaWRlbnRpdHkgYXR0cmlidXRlcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwiUEhPTkVTXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8SWRlbnRpdHlVcGRhdGVUeXBlcz47IH19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfaWRlbnRpdHk6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8SWRlbnRpdHlVcGRhdGVUeXBlcz47IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHVwbG9hZGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudCBvYmplY3Qgd2l0aCBtZXRhZGF0YSBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWQge1xuICAgIC8qKlxuICAgICAqIEEgVVVJRCBpZGVudGlmeWluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHJpc2tfaW5zaWdodHM/OiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3VibWl0dGVkIGRvY3VtZW50IHR5cGUuIEN1cnJlbnRseSwgdGhpcyB3aWxsIGFsd2F5cyBiZSBgQkFOS19TVEFURU1FTlRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1cGxvYWRlZCBkb2N1bWVudFxcJ3MgYWNjb3VudCBudW1iZXIgbWF0Y2hlcyB0aGUgYWNjb3VudCBudW1iZXIgd2UgaGF2ZSBvbiBmaWxlLiBJZiBgZmFsc2VgLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXB0IHRoZSB1cGxvYWRlZCBpZGVudGl0eSBkYXRhIGFzIGFjY3VyYXRlIHdpdGhvdXQgZnVydGhlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGlzX2FjY291bnRfbnVtYmVyX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBkb2N1bWVudCB3YXMgbGFzdCB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBvcmlnaW5hbGx5IHVwbG9hZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIHVwbG9hZGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50aW5nIGZyYXVkIHJpc2sgZGF0YSBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQuIE9ubHkgcHJvdmlkZWQgd2hlbiB1c2luZyBJZGVudGl0eSBEb2N1bWVudCBVcGxvYWQgd2l0aCBGcmF1ZCBSaXNrIGVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gICAgICovXG4gICAgcmlza19zdW1tYXJ5PzogSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHJpc2sgc2lnbmFscy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gICAgICovXG4gICAgcmlza19zaWduYWxzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBSaXNrIHNpZ25hbHMgdGllZCB0byB0aGUgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmlzayBmb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGZyYXVkIHJpc2sgd2FzIGRldGVjdGVkIG9uIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBoYXNfZnJhdWRfcmlzaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gcHJvdmlkaW5nIG1vcmUgZGV0YWlsIGFib3V0IHRoZSBzcGVjaWZpYyByaXNrIHNpZ25hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaXNrIHNpZ25hbC4gSWYgdGhlIHJpc2sgc2lnbmFsIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwYWdlLCB0aGUgdmFsdWUgd2lsbCBiZSAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBSaXNrIHN1bW1hcnkgb2YgYW4gdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1N1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2hcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgbWF0Y2ggaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUsIHBob25lIG51bWJlciwgZW1haWwgYWRkcmVzcyBhbmQgYWRkcmVzcyB1c2VkIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2guIElmIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIGlzIGVuYWJsZWQgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LCBsZWF2ZSB0aGlzIGZpZWxkIGVtcHR5IHRvIGF1dG9tYXRpY2FsbHkgbWF0Y2ggYWdhaW5zdCBQSUkgY29sbGVjdGVkIGZyb20gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBjaGVja3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTU3NDUyMTMwXFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuIFBob25lIG51bWJlciBpbnB1dCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMgfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGlkZW50aXR5IGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlVcGRhdGVUeXBlcyB7XG4gICAgUGhvbmVzID0gJ1BIT05FUycsXG4gICAgQWRkcmVzc2VzID0gJ0FERFJFU1NFUycsXG4gICAgRW1haWxzID0gJ0VNQUlMUycsXG4gICAgTmFtZXMgPSAnTkFNRVMnXG59XG5cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gYXV0b2ZpbGxlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BPQm94U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBcXCcvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZVxcJ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3NoYXJlYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZsYWcgc3BlY2lmeWluZyBob3cgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gaGFuZGxlIGF0dGVtcHRzIHRvIGNyZWF0ZSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gd2hlbiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBpZGVtcG90ZW5jeSBpcyBlbmFibGVkLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBJZiBpZGVtcG90ZW5jeSBpcyBkaXNhYmxlZCwgUGxhaWQgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCBhIGA0MDAgQmFkIFJlcXVlc3RgIHN0YXR1cyBjb2RlIGlmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHN1cHBsaWVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2lkZW1wb3RlbnQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC4gSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHNoYXJlYWJsZSBVUkwgZmVhdHVyZSwgeW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlc2UgZmllbGRzIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbnN0ZWFkOyBib3RoIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYW5kIGAvbGluay90b2tlbi9jcmVhdGVgIGFyZSB2YWxpZCB3YXlzIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIGEgbm9uLWBudWxsYCB1c2VyIGRhdGEgb2JqZWN0IHZpYSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgLCBhbnkgdXNlciBkYXRhIGZpZWxkcyBlbnRlcmVkIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCB3aWxsIGJlIGlnbm9yZWQgd2hlbiBwcmVmaWxsaW5nIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5aW5nIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcHJvdmlkZSBgY2xpZW50X3VzZXJfaWRgIGF0IHRoZSByb290IGxldmVsIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IHJlcHJlc2VudHMgYSBjdXN0b21lclxcJ3MgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlaXIgaWRlbnRpdHksIHJlZmxlY3RpbmcgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciBjb21wbGV0aW5nIHRoZSBzZXNzaW9uLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBzdGVwLCBhbmQgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHRoZSBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFRoZSBhZGRyZXNzIG11c3QgYXQgbGVhc3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBiZSBhIHZhbGlkIGFkZHJlc3M6IGBzdHJlZXRgLCBgY2l0eWAsIGBjb3VudHJ5YC4gSWYgYW55IGFyZSBtaXNzaW5nIG9yIHVuYWJsZSB0byBiZSBleHRyYWN0ZWQsIHRoZSBhZGRyZXNzIHdpbGwgYmUgbnVsbC4gIGByZWdpb25gLCBhbmQgYHBvc3RhbF9jb2RlYCBtYXkgYmUgbnVsbCBiYXNlZCBvbiB0aGUgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlICBOb3RlOiBPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiAoT0NSKSB0ZWNobm9sb2d5IG1heSBzb21ldGltZXMgZXh0cmFjdCBpbmNvcnJlY3QgZGF0YSBmcm9tIGEgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENpdHkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluZGl2aWR1YWxcXCdzIG5hbWUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgUGxhaWQgc2Vzc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgc2Vzc2lvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6IEFycmF5PElkZW50aXR5VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogWW91IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBwcmUtcG9wdWxhdGUgdGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWU7IGlmIGl0IGlzIHByb3ZpZGVkIGhlcmUsIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGhhcyBub3Qgc3VibWl0dGVkIHRoZWlyIG5hbWUsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBPdGhlcndpc2UsIGJvdGggZmllbGRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHJldHJpZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVRSSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciByZXRyeWluZyBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHJhdGVneX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJhdGVneTogU3RyYXRlZ3k7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHN0ZXBzPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIHJldHJpZWQuIElmIGEgdmFsdWUgZm9yIHRoaXMgZmxhZyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgYGlzX3NoYXJlYWJsZWAgc2V0dGluZyBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJpZmljYXRpb24gYXR0ZW1wdCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfc2hhcmVhYmxlPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc3RydWN0aW9ucyBmb3IgdGhlIGBjdXN0b21gIHJldHJ5IHN0cmF0ZWd5IHNwZWNpZnlpbmcgd2hpY2ggc3RlcHMgc2hvdWxkIGJlIHJlcXVpcmVkIG9yIHNraXBwZWQuICAgTm90ZTogICBUaGlzIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQgd2hlbiB0aGUgcmV0cnkgc3RyYXRlZ3kgaXMgYGN1c3RvbWAgYW5kIG11c3QgYmUgb21pdHRlZCBvdGhlcndpc2UuICBDdXN0b20gcmV0cmllcyBvdmVycmlkZSBzZXR0aW5ncyBpbiB5b3VyIFBsYWlkIFRlbXBsYXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBQbGFpZCBUZW1wbGF0ZSBoYXMgYHZlcmlmeV9zbXNgIGRpc2FibGVkLCBhIGN1c3RvbSByZXRyeSB3aXRoIGB2ZXJpZnlfc21zYCBlbmFibGVkIHdpbGwgc3RpbGwgcmVxdWlyZSB0aGUgc3RlcC4gIFRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzYW5kYm94IHNlcnZlci4gU2FuZGJveCByZXF1ZXN0cyB3aWxsIHNpbGVudGx5IGRpc2FibGUgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAgd2hlbiBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGB2ZXJpZnlfc21zYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiAgIGBhY3RpdmVgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlzIGluY29tcGxldGUuIFRoZSB1c2VyIG1heSBoYXZlIGNvbXBsZXRlZCBwYXJ0IG9mIHRoZSBzZXNzaW9uLCBidXQgaGFzIG5laXRoZXIgZmFpbGVkIG9yIHBhc3NlZC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkLCBwYXNzaW5nIGFsbCBzdGVwcyBkZWZpbmVkIHRvIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgb25lIG9yIG1vcmUgc3RlcHMgaW4gdGhlIHNlc3Npb24gYW5kIHdhcyB0b2xkIHRvIGNvbnRhY3Qgc3VwcG9ydC4gIGBleHBpcmVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgYWN0aXZlIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgd2l0aG91dCBiZWluZyBjb21wbGV0ZWQgYW5kIHdhcyBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBleHBpcmVkLiBOb3RlIHRoYXQgc2Vzc2lvbnMgY3VycmVudGx5IGRvIG5vdCBleHBpcmUuIEF1dG9tYXRpYyBleHBpcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGVuYWJsZWQgaW4gdGhlIGZ1dHVyZS4gIGBjYW5jZWxlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGVkLCBlaXRoZXIgdmlhIHRoZSBkYXNoYm9hcmQgYnkgYSB1c2VyLCBvciB2aWEgQVBJLiBUaGUgdXNlciBtYXkgaGF2ZSBjb21wbGV0ZWQgcGFydCBvZiB0aGUgc2Vzc2lvbiwgYnV0IGhhcyBuZWl0aGVyIGZhaWxlZCBvciBwYXNzZWQuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBoYXMgYmVlbiB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIHZpYSB0aGUgZGFzaGJvYXJkIG9yIHRoZSBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzdGVwIGluIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBXYWl0aW5nRm9yUHJlcmVxdWlzaXRlID0gJ3dhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZScsXG4gICAgTm90QXBwbGljYWJsZSA9ICdub3RfYXBwbGljYWJsZScsXG4gICAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIENhbmNlbGVkID0gJ2NhbmNlbGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJyxcbiAgICBNYW51YWxseVJlamVjdGVkID0gJ21hbnVhbGx5X3JlamVjdGVkJ1xufVxuXG4vKipcbiAqIEVhY2ggc3RlcCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICBgYWN0aXZlYCAtIFRoaXMgc3RlcCBpcyB0aGUgdXNlclxcJ3MgY3VycmVudCBzdGVwLiBUaGV5IGFyZSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZyB0aGlzIHN0ZXAsIG9yIHRoZXkgcmVjZW50bHkgY2xvc2VkIHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdoaWxlIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBzdGVwLiBPbmx5IG9uZSBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBhY3RpdmVgIGF0IGFueSBnaXZlbiBwb2ludC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIHRoaXMgc3RlcC4gVGhpcyBjYW4gZWl0aGVyIGNhbGwgdGhlIHVzZXIgdG8gZmFpbCB0aGUgc2Vzc2lvbiBhcyBhIHdob2xlLCBvciBjYXVzZSB0aGVtIHRvIGZhbGxiYWNrIHRvIGFub3RoZXIgc3RlcCBkZXBlbmRpbmcgb24gaG93IHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUgaXMgY29uZmlndXJlZC4gQSBmYWlsZWQgc3RlcCBkb2VzIG5vdCBpbXBseSBhIGZhaWxlZCBzZXNzaW9uLiAgYHdhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZWAgLSBUaGUgdXNlciBuZWVkcyB0byBjb21wbGV0ZSBhbm90aGVyIHN0ZXAgZmlyc3QsIGJlZm9yZSB0aGV5IHByb2dyZXNzIHRvIHRoaXMgc3RlcC4gVGhpcyBzdGVwIG1heSBuZXZlciBydW4sIGRlcGVuZGluZyBvbiBpZiB0aGUgdXNlciBmYWlscyBhbiBlYXJsaWVyIHN0ZXAgb3IgaWYgdGhlIHN0ZXAgaXMgb25seSBydW4gYXMgYSBmYWxsYmFjay4gIGBub3RfYXBwbGljYWJsZWAgLSBUaGlzIHN0ZXAgd2lsbCBub3QgYmUgcnVuIGZvciB0aGlzIHNlc3Npb24uICBgc2tpcHBlZGAgLSBUaGUgcmV0cnkgaW5zdHJ1Y3Rpb25zIHRoYXQgY3JlYXRlZCB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHNwZWNpZmllZCB0aGF0IHRoaXMgc3RlcCBzaG91bGQgYmUgc2tpcHBlZC4gIGBleHBpcmVkYCAtIFRoaXMgc3RlcCBoYWQgbm90IHlldCBiZWVuIGNvbXBsZXRlZCB3aGVuIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhcyBhIHdob2xlIGV4cGlyZWQuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCBiZWZvcmUgdGhlIHVzZXIgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LiAgYG1hbnVhbGx5X2FwcHJvdmVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIHBhc3MgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLiAgYG1hbnVhbGx5X3JlamVjdGVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIGZhaWwgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGFjY2VwdF90b3M6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgY29tcGxldGVkIGEgc3RlcCBvZiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RFUF9VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgSUQgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZW1wbGF0ZSBjb25maWd1cmluZyB0aGUgYmVoYXZpb3Igb2YgYSBnaXZlbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGlkZW50aXR5IGRhdGEgdGhhdCB3YXMgZWl0aGVyIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyIG9yIHByb3ZpZGVkIHZpYSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBoaWdoIGxldmVsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGUgdXNlciBzdWJtaXR0ZWQuICBGb3IgZXhhbXBsZSwgYW4gaW1hZ2UgdGhhdCBpcyBibHVycnksIGRpc3RvcnRlZCBieSBnbGFyZSBmcm9tIGEgbmVhcmJ5IGxpZ2h0IHNvdXJjZSwgb3IgaW1wcm9wZXJseSBmcmFtZWQgbWlnaHQgYmUgbWFya2VkIGFzIGxvdyBvciBtZWRpdW0gcXVhbGl0eS4gUG9vciBxdWFsaXR5IGltYWdlcyBhcmUgbW9yZSBsaWtlbHkgdG8gZmFpbCBPQ1IgYW5kL29yIHRlbXBsYXRlIGNvbmZvcm1pdHkgY2hlY2tzLiAgTm90ZTogQnkgZGVmYXVsdCwgUGxhaWQgd2lsbCBsZXQgYSB1c2VyIHJlY2FwdHVyZSBkb2N1bWVudCBpbWFnZXMgdHdpY2UgYmVmb3JlIGZhaWxpbmcgdGhlIGVudGlyZSBzZXNzaW9uIGlmIHdlIGF0dHJpYnV0ZSB0aGUgZmFpbHVyZSB0byBsb3cgaW1hZ2UgcXVhbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eSB7XG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBMb3cgPSAnbG93J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGltYWdlIHF1YWxpdHkgb2YgdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbWFnZVF1YWxpdHlEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VRdWFsaXR5RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eU91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEltYWdlUXVhbGl0eURldGFpbHNcbiAgICAgKi9cbiAgICBnbGFyZV9jaGVjazogSW1hZ2VRdWFsaXR5T3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGRpbWVuc2lvbnNfY2hlY2s6IEltYWdlUXVhbGl0eU91dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eU91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEltYWdlUXVhbGl0eURldGFpbHNcbiAgICAgKi9cbiAgICBibHVyX2NoZWNrOiBJbWFnZVF1YWxpdHlPdXRjb21lO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgaW1hZ2UgcXVhbGl0eSBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eU91dGNvbWUge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiB1cGRhdGUgb24gdGhlIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgdXBkYXRlIHdhcyBwdWJsaXNoZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtIHtcbiAgICBJbnZlc3RpZ2F0aW5nID0gJ0lOVkVTVElHQVRJTkcnLFxuICAgIElkZW50aWZpZWQgPSAnSURFTlRJRklFRCcsXG4gICAgU2NoZWR1bGVkID0gJ1NDSEVEVUxFRCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnJlYWtkb3duIG9mIHRoZSBkaWZmZXJlbnQgaW5jb21lIHR5cGVzIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVCcmVha2Rvd25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBJbmNvbWVCcmVha2Rvd25UeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaG91cmx5IHJhdGUgYXQgd2hpY2ggdGhlIGluY29tZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBob3VycyBsb2dnZWQgZm9yIHRoaXMgaW5jb21lIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHBheSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpbmNvbWUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBcXFwicmVndWxhclxcXCJgOiByZWd1bGFyIGluY29tZSAgIGBcXFwib3ZlcnRpbWVcXFwiYDogb3ZlcnRpbWUgaW5jb21lICAgYFxcXCJib251c1xcXCJgOiBib251cyBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZUJyZWFrZG93blR5cGUge1xuICAgIEJvbnVzID0gJ2JvbnVzJyxcbiAgICBPdmVydGltZSA9ICdvdmVydGltZScsXG4gICAgUmVndWxhciA9ICdyZWd1bGFyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmeSBwYXlyb2xsIGRhdGEgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwYXlzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5c3R1YnM/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB3MnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxXMk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3MnM/OiBBcnJheTxXMk92ZXJyaWRlPjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVNvdXJjZXNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTb3VyY2VzQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIGRldGVjdGVkIGF0IHRoZSBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVNvdXJjZXNDb3VudHNcbiAgICAgKi9cbiAgICBiYXNlbGluZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgY3VycmVudGx5IGRldGVjdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU291cmNlc0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIHZlcmlmaWVkIGZpZWxkcyBmcm9tIGEgcGF5c3R1YiB2ZXJpZmljYXRpb24uIEFsbCBmaWVsZHMgYXJlIHByb3ZpZGVkIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZTogRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZWVfbmFtZTogRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX2dyb3NzX2luY29tZTogWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9uZXRfaW5jb21lOiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IFBheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHByb2plY3RlZF93YWdlOiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmaWVkX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaWVsZCBudW1iZXIgZm9yIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZW5kcG9pbnQgdG8gd2hpY2ggUGxhaWQgc2hvdWxkIHNlbmQgd2ViaG9va3MgcmVsYXRlZCB0byB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHByZWNoZWNrIGNyZWF0ZWQgd2l0aCBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLiBXaWxsIGJlIHVzZWQgdG8gaW1wcm92ZSBjb252ZXJzaW9uIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogT3B0aW9uYWwgYXJndW1lbnRzIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlIHByb2R1Y3QgZGF0YS4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGNvcnJlbGF0ZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gdGhlc2UgSXRlbXMgd2l0aCBkYXRhIGZyb20gdGhlIHVzZXJcXCdzIHBheXN0dWIsIHN1Y2ggYXMgZGF0ZSBhbmQgYW1vdW50LiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIExpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvcHRpb25zIHRvIGVuYWJsZSBmb3IgZG9jdW1lbnQgcGFyc2luZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZyB7XG4gICAgT2NyID0gJ29jcicsXG4gICAgUmlza1NpZ25hbHMgPSAncmlza19zaWduYWxzJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCBJRCB0byBkb3dubG9hZC4gSWYgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcgemlwIGZpbGUsIHJhdGhlciB0aGFuIGFsbCBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmxvdyB0eXBlcyB0byByZXRyaWV2ZSBwYXlyb2xsIGluY29tZSBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGUge1xuICAgIERpZ2l0YWxJbmNvbWUgPSAncGF5cm9sbF9kaWdpdGFsX2luY29tZScsXG4gICAgRG9jdW1lbnRJbmNvbWUgPSAncGF5cm9sbF9kb2N1bWVudF9pbmNvbWUnXG59XG5cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uIGZvciB3aGljaCB0byBnZXQgcGF5c3R1YiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBNZXRhZGF0YSBmb3IgYW4gaW5jb21lIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5c3R1YnM6IEFycmF5PFBheXN0dWI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNvbmZpZGVuY2UgdGhhdCBQbGFpZCBjYW4gc3VwcG9ydCB0aGUgdXNlciBpbiB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBtYW51YWwgcGF5c3R1YiB1cGxvYWQuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJISUdIXFxcImA6IEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgXFxcImBMT1dgXFxcIjogSXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIHVzZXIgY2FuIHVzZSB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuICBgXFxcIlVOS05PV05cXFwiYDogSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIHVzZXIgaXMgc3VwcG9ydGFibGUgd2l0aCB0aGUgaW5mb3JtYXRpb24gcGFzc2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIExvdyA9ICdMT1cnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIHRheCBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICB0YXhfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBlbXBsb3llclxcJ3MgcHVibGljIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgbWlsaXRhcnkgaW5mbyBpbiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcmVjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mbyB7XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHVzZXIgY3VycmVudGx5IGFjdGl2ZSBkdXR5IGluIHRoZSBVUyBtaWxpdGFyeVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGlzX2FjdGl2ZV9kdXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlcnZpbmcgaW4gdGhlIFVTIG1pbGl0YXJ5LCB0aGUgYnJhbmNoIG9mIHRoZSBtaWxpdGFyeSBpbiB3aGljaCB0aGV5IGFyZSBzZXJ2aW5nIFZhbGlkIHZhbHVlczogXFwnQUlSIEZPUkNFXFwnLCBcXCdBUk1ZXFwnLCBcXCdDT0FTVCBHVUFSRFxcJywgXFwnTUFSSU5FU1xcJywgXFwnTkFWWVxcJywgXFwnVU5LTk9XTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gICAgICovXG4gICAgYnJhbmNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBwYXlyb2xsIGluc3RpdHV0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHBheXJvbGwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5cm9sbF9pbnN0aXR1dGlvbj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcHJlY2hlY2suIFByb3ZpZGUgdGhpcyB2YWx1ZSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW4gb3JkZXIgdG8gb3B0aW1pemUgTGluayBjb252ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmVjaGVja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBob21lX2FkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIGF0dGVtcHQgdG8gcmVmcmVzaCBQYXlyb2xsIEluY29tZSBkYXRhIGZvciBhIHVzZXIgdmlhIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIGZhaWxlZCBiZWNhdXNlIHRoZSB1c2VyIG11c3QgcmUtY29ubmVjdCB0aGVpciBwYXlyb2xsIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SRUZSRVNIX1JFQ09OTkVDVF9ORUVERURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmlzayBzaWduYWxzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGRvY3VtZW50cyB1cGxvYWRlZCB2aWEgRG9jdW1lbnQgSW5jb21lLiBJdCB3aWxsIHR5cGljYWxseSB0YWtlIGEgbWludXRlIG9yIHR3byBmb3IgdGhpcyB3ZWJob29rIHRvIGZpcmUgYWZ0ZXIgdGhlIGVuZCB1c2VyIGhhcyB1cGxvYWRlZCB0aGVpciBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIG1heSB0aGVuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBhbmQgdG8gcmV0cmlldmUgcmlzayBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiSU5DT01FXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUklTS19TSUdOQUxTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmcmF1ZCBkZXRlY3Rpb24gcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGFsbCByaXNrIHNpZ25hbCBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsc19zdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSBoYXMgY2hhbmdlZC4gVGhpcyB3ZWJob29rIGlzIGZpcmVkIGZvciBib3RoIHRoZSBEb2N1bWVudCBhbmQgUGF5cm9sbCBJbmNvbWUgZmxvd3MsIGJ1dCBub3QgdGhlIEJhbmsgSW5jb21lIGZsb3cuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5QYXJlbnQgY29udGFpbmVyIGZvciBuYW1lIHRoYXQgYWxsb3dzIGZvciBjaG9pY2UgZ3JvdXAgYmV0d2VlbiBwYXJzZWQgYW5kIHVucGFyc2VkIGNvbnRhaW5lcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIExhc3ROYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwsIGluY2x1ZGluZyBhbGwgcGFydHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgbmFtZXMgYXJlIHRob3NlIG1vc3QgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byB0aGlzIHBlcnNvbi4gT25seSBvbmUgbmFtZSB3aWxsIGV2ZXIgYmUgbWFya2VkIGFzIHByaW1hcnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIHdlYWtfYWxpYXNfZGV0ZXJtaW5hdGlvbjogV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbjtcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGluZGl2aWR1YWxzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX0NJQWA6IENJQSBMaXN0IG9mIENoaWVmcyBvZiBTdGF0ZSBhbmQgQ2FiaW5ldCBNZW1iZXJzICBgSVpfSVBMYDogSW50ZXJwb2wgUmVkIE5vdGljZXMgZm9yIFdhbnRlZCBQZXJzb25zIExpc3QgIGBJWl9QRVBgOiBQb2xpdGljYWxseSBFeHBvc2VkIFBlcnNvbnMgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVS19ITUNgOiBVSyBITSBUcmVhc3VyeSBDb25zb2xpZGF0ZWQgTGlzdCAgYFVTX0RQTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgRGVuaWVkIFBlcnNvbnMgTGlzdCAgYFVTX0RUQ2A6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgQUVDQSBEZWJhcnJlZCAgYFVTX0ZCSWA6IFVTIERlcGFydG1lbnQgb2YgSnVzdGljZSBGQkkgV2FudGVkIExpc3QgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19JU05gOiBVUyBEZXBhcnRtZW50IG9mIFN0YXRlIE5vbnByb2xpZmVyYXRpb24gU2FuY3Rpb25zICBgVVNfUExDYDogVVMgT0ZBQyBQYWxlc3RpbmlhbiBMZWdpc2xhdGl2ZSBDb3VuY2lsICBgVVNfU0ROYDogVVMgT0ZBQyBTcGVjaWFsbHkgRGVzaWduYXRlZCBOYXRpb25hbHMgTGlzdCAgYFVTX1NTSWA6IFVTIE9GQUMgU2VjdG9yYWwgU2FuY3Rpb25zIElkZW50aWZpY2F0aW9ucyAgYFNHX1NPRmA6IEdvdmVybm1lbnQgb2YgU2luZ2Fwb3JlIFRlcnJvcmlzdHMgYW5kIFRlcnJvcmlzdCBFbnRpdGllcyAgYFRSX1RXTGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFRlcnJvcmlzdCBXYW50ZWQgTGlzdCAgYFRSX0RGRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IERvbWVzdGljIEZyZWV6aW5nIERlY2lzaW9ucyAgYFRSX0ZPUmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IEZvcmVpZ24gRnJlZXppbmcgUmVxdWVzdHMgIGBUUl9XTURgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBXZWFwb25zIG9mIE1hc3MgRGVzdHJ1Y3Rpb24gIGBUUl9DTUJgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBDYXBpdGFsIE1hcmtldHMgQm9hcmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlIHtcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJekNpYSA9ICdJWl9DSUEnLFxuICAgIEl6SXBsID0gJ0laX0lQTCcsXG4gICAgSXpQZXAgPSAnSVpfUEVQJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVWtIbWMgPSAnVUtfSE1DJyxcbiAgICBVc0RwbCA9ICdVU19EUEwnLFxuICAgIFVzRHRjID0gJ1VTX0RUQycsXG4gICAgVXNGYmkgPSAnVVNfRkJJJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzSXNuID0gJ1VTX0lTTicsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1BsYyA9ICdVU19QTEMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBTZ1NvZiA9ICdTR19TT0YnLFxuICAgIFRyVHdsID0gJ1RSX1RXTCcsXG4gICAgVHJEZmQgPSAnVFJfREZEJyxcbiAgICBUckZvciA9ICdUUl9GT1InLFxuICAgIFRyV21kID0gJ1RSX1dNRCcsXG4gICAgVHJDbWIgPSAnVFJfQ01CJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2UgcmVndWxhciBwYXltZW50cyBvbiBhIGxvYW4uIEFueSB0cmFuc2FjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBgaW5mbG93X21vZGVsYCB3aWxsIGFwcGVhciBpbiBhZGRpdGlvbiB0byByYW5kb21seSBnZW5lcmF0ZWQgdGVzdCBkYXRhIG9yIHRyYW5zYWN0aW9ucyBzcGVjaWZpZWQgYnkgYG92ZXJyaWRlX2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5mbG93TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZsb3dNb2RlbCB7XG4gICAgLyoqXG4gICAgICogSW5mbG93IG1vZGVsLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBub25lYDogTm8gaW5jb21lICBgbW9udGhseS1pbmNvbWVgOiBJbmNvbWUgb2NjdXJzIG9uY2UgcGVyIG1vbnRoIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGA6IFBheXMgb2ZmIHRoZSBiYWxhbmNlIG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgOiBNYWtlcyBhbiBpbnRlcmVzdC1vbmx5IHBheW1lbnQgb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIE5vdGUgdGhhdCBhY2NvdW50IHR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcyB3aWxsIGFjY3J1ZSBpbnRlcmVzdCBpbiB0aGUgU2FuZGJveC4gVGhlIHR5cGVzIGltcGFjdGVkIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBzdWJ0eXBlIGBjcmVkaXRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGluY29tZSBwZXIgbW9udGguIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBpbmNvbWVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24gd2lsbCBhcHBlYXIuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHBheW1lbnRfZGF5X29mX21vbnRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgYmFsYW5jZSBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRfZGF5X29mX21vbnRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gVGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERldGFpbHMgcmVsYXRpbmcgdG8gYSBzcGVjaWZpYyBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIG1heSBoYXZlIG11bHRpcGxlIHJlY29yZHMsIGVhY2ggd2l0aCBkaWZmZXJlbnQgaW5zdGl0dXRpb24gSURzOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RpdHV0aW9uIGhhcyBtaWdyYXRlZCB0byBPQXV0aCwgdGhlcmUgbWF5IGJlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciB0aGUgT0F1dGggYW5kIG5vbi1PQXV0aCB2ZXJzaW9ucyBvZiB0aGUgaW5zdGl0dXRpb24uIEluc3RpdHV0aW9ucyB0aGF0IG9wZXJhdGUgaW4gZGlmZmVyZW50IGNvdW50cmllcyBvciB3aXRoIG11bHRpcGxlIGxvZ2luIHBvcnRhbHMgbWF5IGFsc28gaGF2ZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgZWFjaCBjb3VudHJ5IG9yIHBvcnRhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgUGxhaWQgcHJvZHVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IG9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IEF1dGggd2lsbCByZXR1cm4gYGF1dGhgIGluIHRoZSBwcm9kdWN0IGFycmF5OyBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgbGlzdCBgYXV0aGAgbWF5IHN0aWxsIHN1cHBvcnQgb3RoZXIgQXV0aCBtZXRob2RzIHN1Y2ggYXMgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBWZXJpZmljYXRpb24uIFRvIGlkZW50aWZ5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgbWV0aG9kcywgdXNlIHRoZSBgYXV0aF9tZXRhZGF0YWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0Z1bGwgQXV0aCBjb3ZlcmFnZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcHJvZHVjdCBoZXJlIGluZGljYXRlcyBzdXBwb3J0IGZvciBCYW5rIEluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGtub3duIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBpbmNsdWRlX3N0YXR1c2Agb3B0aW9uIHNldCB0byB0cnVlLiBOb3RlIHRoYXQgaW5zdGl0dXRpb24gc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpdGVtX2xvZ2lucz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgYXV0aD86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiByZWNlbnQgaGVhbHRoIGluY2lkZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxIZWFsdGhJbmNpZGVudD59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaGVhbHRoX2luY2lkZW50cz86IEFycmF5PEhlYWx0aEluY2lkZW50PiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaW5zdGl0dXRpb24gc3RhdHVzIG1lZXRzIHRoZSBjb25kaXRpb25zIGNvbmZpZ3VyZWQgaW4gdGhlIGRldmVsb3BlciBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBEQVNIQk9BUkRfQ09ORklHVVJFRF9BTEVSVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNUSVRVVElPTl9TVEFUVVNfQUxFUlRfVFJJR0dFUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZ2xvYmFsIHN1Y2Nlc3MgcmF0ZSBvZiB0aGUgaW5zdGl0dXRpb24sIGNhbGN1bGF0ZWQgYmFzZWQgb24gaXRlbSBhZGQgaGVhbHRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fb3ZlcmFsbF9zdWNjZXNzX3JhdGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBSVFAgbmV0d29yayBhbmQgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFB9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3NcbiAgICAgKi9cbiAgICBydHA6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGluc3RpdHV0aW9uIHRvIGdldCBkZXRhaWxzIGFib3V0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyLCB0aGUgYGNvdW50cnlfY29kZXNgIHBhcmFtZXRlciBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2l0aGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGFuZCB3aWxsIGRlZmF1bHQgdG8gYFtVU11gIGlmIGl0IGlzIG5vdCBzdXBwbGllZC4gXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0X2J5X2lkYC4gSWYgcHJvdmlkZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIGFuIGluc3RpdHV0aW9uXFwncyBsb2dvLCBicmFuZCBjb2xvciwgYW5kIFVSTC4gV2hlbiBhdmFpbGFibGUsIHRoZSBiYW5rXFwncyBsb2dvIGlzIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcsIHRoZSBicmFuZCBjb2xvciBpcyBpbiBoZXhhZGVjaW1hbCBmb3JtYXQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuICBOb3RlIHRoYXQgUGxhaWQgZG9lcyBub3Qgb3duIGFueSBvZiB0aGUgbG9nb3Mgc2hhcmVkIGJ5IHRoZSBBUEkgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgcmVzcG9uc2Ugd2lsbCBpbmNsdWRlIHN0YXR1cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5zdGl0dXRpb24uIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9zdGF0dXM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BheW1lbnRfaW5pdGlhdGlvbl9tZXRhZGF0YT86IGJvb2xlYW47XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBJbnN0aXR1dGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBJbnN0aXR1dGlvbnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHNraXAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggY291bnRyeSBvciBjb3VudHJpZXMgdG8gaW5jbHVkZSBpbnN0aXR1dGlvbnMgZnJvbSwgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuICBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW5zdGl0dXRpb25zL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBJbnN0aXR1dGlvbnMgYmFzZWQgb24gd2hpY2ggcHJvZHVjdHMgdGhleSBzdXBwb3J0LiBXaWxsIG9ubHkgcmV0dXJuIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgYWxsIGxpc3RlZCBwcm9kdWN0cy4gV2hlbiBmaWx0ZXJpbmcgYmFzZWQgb24gYGF1dGhgLCBhbiBpbnN0aXR1dGlvbiBtdXN0IHN1cHBvcnQgSW5zdGFudCBBdXRoIHRvIG1hdGNoIHRoZSBjcml0ZXJpb24uXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBhcnJheSBvZiByb3V0aW5nIG51bWJlcnMgdG8gZmlsdGVyIGluc3RpdHV0aW9ucy4gVGhlIHJlc3BvbnNlIHdpbGwgb25seSByZXR1cm4gaW5zdGl0dXRpb25zIHRoYXQgbWF0Y2ggYWxsIG9mIHRoZSByb3V0aW5nIG51bWJlcnMgaW4gdGhlIGFycmF5LiBSb3V0aW5nIG51bWJlciByZWNvcmRzIHVzZWQgZm9yIHRoaXMgbWF0Y2hpbmcgYXJlIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlOyBob3dldmVyLCBmYWlsdXJlIHRvIG1hdGNoIGEgZ2l2ZW4gcm91dGluZyBudW1iZXIgdG8gYW4gaW5zdGl0dXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0IHRoZSBpbnN0aXR1dGlvbiBpcyB1bnN1cHBvcnRlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaW1pdCByZXN1bHRzIHRvIGluc3RpdHV0aW9ucyB3aXRoIG9yIHdpdGhvdXQgT0F1dGggbG9naW4gZmxvd3MuIE5vdGUgdGhhdCBpbnN0aXR1dGlvbnMgd2lsbCBoYXZlIGBvYXV0aGAgc2V0IHRvIGB0cnVlYCBpZiBzb21lIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGluc3RpdHV0aW9uIGFyZSByZXF1aXJlZCB0byB1c2UgT0F1dGggZmxvd3M7IGluc3RpdHV0aW9ucyBpbiBhIHN0YXRlIG9mIG1pZ3JhdGlvbiB0byBPQXV0aCB3aWxsIGhhdmUgdGhlIGBvYXV0aGAgYXR0cmlidXRlIHNldCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2F1dGg/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLiBOb3QgYWxsIGluc3RpdHV0aW9uc1xcJyBsb2dvcyBhcmUgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJLCBhbmQgdGhhdCBieSBhY2Nlc3Npbmcgb3IgdXNpbmcgdGhlc2UgbG9nb3MsIHlvdSBhZ3JlZSB0aGF0IHlvdSBhcmUgZG9pbmcgc28gYXQgeW91ciBvd24gcmlzayBhbmQgd2lsbCwgaWYgbmVjZXNzYXJ5LCBvYnRhaW4gYWxsIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZyb20gdGhlIGFwcHJvcHJpYXRlIHJpZ2h0cyBob2xkZXJzIGFuZCBhZGhlcmUgdG8gYW55IGFwcGxpY2FibGUgdXNhZ2UgZ3VpZGVsaW5lcy4gUGxhaWQgZGlzY2xhaW1zIGFsbCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGxvZ29zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIFBsYWlkIGluc3RpdHV0aW9uc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYXZhaWxhYmxlIHZpYSB0aGlzIGVuZHBvaW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gYWNjb3VudCBmaWx0ZXIgdG8gYXBwbHkgdG8gaW5zdGl0dXRpb25zIHNlYXJjaCByZXF1ZXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGNyZWRpdD86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZpbHRlciBpbnN0aXR1dGlvbnMgYnkgdmFyaW91cyBQYXltZW50IEluaXRpYXRpb24gY29uZmlndXJhdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL3NlYXJjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2VhcmNoIHF1ZXJ5LiBJbnN0aXR1dGlvbnMgd2l0aCBuYW1lcyBtYXRjaGluZyB0aGUgcXVlcnkgYXJlIHJldHVybmVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBJbnN0aXR1dGlvbnMgYmFzZWQgb24gd2hldGhlciB0aGV5IHN1cHBvcnQgYWxsIHByb2R1Y3RzIGxpc3RlZCBpbiBgcHJvZHVjdHNgLiBQcm92aWRlIGBudWxsYCB0byBnZXQgaW5zdGl0dXRpb25zIHJlZ2FyZGxlc3Mgb2Ygc3VwcG9ydGVkIHByb2R1Y3RzLiBOb3RlIHRoYXQgd2hlbiBgYXV0aGAgaXMgc3BlY2lmaWVkIGFzIGEgcHJvZHVjdCwgaWYgeW91IGFyZSBlbmFibGVkIGZvciBJbnN0YW50IE1hdGNoIG9yIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cywgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCB0aG9zZSBwcm9kdWN0cyB3aWxsIGJlIHJldHVybmVkIGV2ZW4gaWYgYGF1dGhgIGlzIG5vdCBwcmVzZW50IGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW5zdGl0dXRpb25zL3NlYXJjaGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBOb3RlIHRoYXQgaW5zdGl0dXRpb25zIHdpbGwgaGF2ZSBgb2F1dGhgIHNldCB0byBgdHJ1ZWAgaWYgc29tZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQgdG8gdXNlIE9BdXRoIGZsb3dzOyBpbnN0aXR1dGlvbnMgaW4gYSBzdGF0ZSBvZiBtaWdyYXRpb24gdG8gT0F1dGggd2lsbCBoYXZlIHRoZSBgb2F1dGhgIGF0dHJpYnV0ZSBzZXQgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCByZXR1cm4gdGhlIGluc3RpdHV0aW9uXFwncyBob21lcGFnZSBVUkwsIGxvZ28gYW5kIHByaW1hcnkgYnJhbmQgY29sb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcHRpb25hbF9tZXRhZGF0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgQXV0aCBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggYXV0aCBtZXRob2RzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybnMgbWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgUGF5bWVudCBJbml0aWF0aW9uIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBwYXltZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHBheW1lbnRfaW5pdGlhdGlvbj86IEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvc2VhcmNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBpbnN0aXR1dGlvbnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEB0eXBlIHtBcnJheTxJbnN0aXR1dGlvbj59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zOiBBcnJheTxJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtaW52ZXN0bWVudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50QWNjb3VudFN1YnR5cGUge1xuICAgIF81MjkgPSAnNTI5JyxcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBDYXNoSXNhID0gJ2Nhc2ggaXNhJyxcbiAgICBDcnlwdG9FeGNoYW5nZSA9ICdjcnlwdG8gZXhjaGFuZ2UnLFxuICAgIEVkdWNhdGlvblNhdmluZ3NBY2NvdW50ID0gJ2VkdWNhdGlvbiBzYXZpbmdzIGFjY291bnQnLFxuICAgIEZpeGVkQW5udWl0eSA9ICdmaXhlZCBhbm51aXR5JyxcbiAgICBHaWMgPSAnZ2ljJyxcbiAgICBIZWFsdGhSZWltYnVyc2VtZW50QXJyYW5nZW1lbnQgPSAnaGVhbHRoIHJlaW1idXJzZW1lbnQgYXJyYW5nZW1lbnQnLFxuICAgIEhzYSA9ICdoc2EnLFxuICAgIElyYSA9ICdpcmEnLFxuICAgIElzYSA9ICdpc2EnLFxuICAgIEtlb2doID0gJ2tlb2doJyxcbiAgICBMaWYgPSAnbGlmJyxcbiAgICBMaWZlSW5zdXJhbmNlID0gJ2xpZmUgaW5zdXJhbmNlJyxcbiAgICBMaXJhID0gJ2xpcmEnLFxuICAgIExyaWYgPSAnbHJpZicsXG4gICAgTHJzcCA9ICdscnNwJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBOb25DdXN0b2RpYWxXYWxsZXQgPSAnbm9uLWN1c3RvZGlhbCB3YWxsZXQnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJBbm51aXR5ID0gJ290aGVyIGFubnVpdHknLFxuICAgIE90aGVySW5zdXJhbmNlID0gJ290aGVyIGluc3VyYW5jZScsXG4gICAgUGVuc2lvbiA9ICdwZW5zaW9uJyxcbiAgICBQcmlmID0gJ3ByaWYnLFxuICAgIFByb2ZpdFNoYXJpbmdQbGFuID0gJ3Byb2ZpdCBzaGFyaW5nIHBsYW4nLFxuICAgIFFzaHIgPSAncXNocicsXG4gICAgUmRzcCA9ICdyZHNwJyxcbiAgICBSZXNwID0gJ3Jlc3AnLFxuICAgIFJldGlyZW1lbnQgPSAncmV0aXJlbWVudCcsXG4gICAgUmxpZiA9ICdybGlmJyxcbiAgICBSb3RoID0gJ3JvdGgnLFxuICAgIFJvdGg0MDFrID0gJ3JvdGggNDAxaycsXG4gICAgUnJpZiA9ICdycmlmJyxcbiAgICBScnNwID0gJ3Jyc3AnLFxuICAgIFNhcnNlcCA9ICdzYXJzZXAnLFxuICAgIFNlcElyYSA9ICdzZXAgaXJhJyxcbiAgICBTaW1wbGVJcmEgPSAnc2ltcGxlIGlyYScsXG4gICAgU2lwcCA9ICdzaXBwJyxcbiAgICBTdG9ja1BsYW4gPSAnc3RvY2sgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5JyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBIHRyYW5zYWN0aW9uIHdpdGhpbiBhbiBpbnZlc3RtZW50IGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBJbnZlc3RtZW50IHRyYW5zYWN0aW9uLCB1bmlxdWUgYWNyb3NzIGFsbCBQbGFpZCB0cmFuc2FjdGlvbnMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxlZ2FjeSBmaWVsZCBmb3JtZXJseSB1c2VkIGludGVybmFsbHkgYnkgUGxhaWQgdG8gaWRlbnRpZnkgY2VydGFpbiBjYW5jZWxlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYW5jZWxfdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBzZWN1cml0eV9pZGAgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBpcyByZWxhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBwb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9u4oCZcyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIGZvciBidXkgdHJhbnNhY3Rpb25zOyBuZWdhdGl2ZSBmb3Igc2VsbCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGxldGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGRlYml0ZWQsIGUuZy4gcHVyY2hhc2VzIG9mIHN0b2NrOyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBjYXNoIGlzIGNyZWRpdGVkLCBlLmcuIHNhbGVzIG9mIHN0b2NrLiBUcmVhdG1lbnQgcmVtYWlucyB0aGUgc2FtZSBmb3IgY2FzaC1vbmx5IG1vdmVtZW50cyB1bmFzc29jaWF0ZWQgd2l0aCBzZWN1cml0aWVzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwcmljZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21iaW5lZCB2YWx1ZSBvZiBhbGwgZmVlcyBhcHBsaWVkIHRvIHRoaXMgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmZWVzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEZvciBkZXNjcmlwdGlvbnMgb2YgcG9zc2libGUgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtJbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2ludmVzdG1lbnQtdHJhbnNhY3Rpb24tdHlwZXMtc2NoZW1hKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblN1YnR5cGUge1xuICAgIEFjY291bnRGZWUgPSAnYWNjb3VudCBmZWUnLFxuICAgIEFkanVzdG1lbnQgPSAnYWRqdXN0bWVudCcsXG4gICAgQXNzaWdubWVudCA9ICdhc3NpZ25tZW50JyxcbiAgICBCdXkgPSAnYnV5JyxcbiAgICBCdXlUb0NvdmVyID0gJ2J1eSB0byBjb3ZlcicsXG4gICAgQ29udHJpYnV0aW9uID0gJ2NvbnRyaWJ1dGlvbicsXG4gICAgRGVwb3NpdCA9ICdkZXBvc2l0JyxcbiAgICBEaXN0cmlidXRpb24gPSAnZGlzdHJpYnV0aW9uJyxcbiAgICBEaXZpZGVuZCA9ICdkaXZpZGVuZCcsXG4gICAgRGl2aWRlbmRSZWludmVzdG1lbnQgPSAnZGl2aWRlbmQgcmVpbnZlc3RtZW50JyxcbiAgICBFeGVyY2lzZSA9ICdleGVyY2lzZScsXG4gICAgRXhwaXJlID0gJ2V4cGlyZScsXG4gICAgRnVuZEZlZSA9ICdmdW5kIGZlZScsXG4gICAgSW50ZXJlc3QgPSAnaW50ZXJlc3QnLFxuICAgIEludGVyZXN0UmVjZWl2YWJsZSA9ICdpbnRlcmVzdCByZWNlaXZhYmxlJyxcbiAgICBJbnRlcmVzdFJlaW52ZXN0bWVudCA9ICdpbnRlcmVzdCByZWludmVzdG1lbnQnLFxuICAgIExlZ2FsRmVlID0gJ2xlZ2FsIGZlZScsXG4gICAgTG9hblBheW1lbnQgPSAnbG9hbiBwYXltZW50JyxcbiAgICBMb25nVGVybUNhcGl0YWxHYWluID0gJ2xvbmctdGVybSBjYXBpdGFsIGdhaW4nLFxuICAgIExvbmdUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnbG9uZy10ZXJtIGNhcGl0YWwgZ2FpbiByZWludmVzdG1lbnQnLFxuICAgIE1hbmFnZW1lbnRGZWUgPSAnbWFuYWdlbWVudCBmZWUnLFxuICAgIE1hcmdpbkV4cGVuc2UgPSAnbWFyZ2luIGV4cGVuc2UnLFxuICAgIE1lcmdlciA9ICdtZXJnZXInLFxuICAgIE1pc2NlbGxhbmVvdXNGZWUgPSAnbWlzY2VsbGFuZW91cyBmZWUnLFxuICAgIE5vblF1YWxpZmllZERpdmlkZW5kID0gJ25vbi1xdWFsaWZpZWQgZGl2aWRlbmQnLFxuICAgIE5vblJlc2lkZW50VGF4ID0gJ25vbi1yZXNpZGVudCB0YXgnLFxuICAgIFBlbmRpbmdDcmVkaXQgPSAncGVuZGluZyBjcmVkaXQnLFxuICAgIFBlbmRpbmdEZWJpdCA9ICdwZW5kaW5nIGRlYml0JyxcbiAgICBRdWFsaWZpZWREaXZpZGVuZCA9ICdxdWFsaWZpZWQgZGl2aWRlbmQnLFxuICAgIFJlYmFsYW5jZSA9ICdyZWJhbGFuY2UnLFxuICAgIFJldHVybk9mUHJpbmNpcGFsID0gJ3JldHVybiBvZiBwcmluY2lwYWwnLFxuICAgIFJlcXVlc3QgPSAncmVxdWVzdCcsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBTZWxsU2hvcnQgPSAnc2VsbCBzaG9ydCcsXG4gICAgU2VuZCA9ICdzZW5kJyxcbiAgICBTaG9ydFRlcm1DYXBpdGFsR2FpbiA9ICdzaG9ydC10ZXJtIGNhcGl0YWwgZ2FpbicsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW5SZWludmVzdG1lbnQgPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBTcGluT2ZmID0gJ3NwaW4gb2ZmJyxcbiAgICBTcGxpdCA9ICdzcGxpdCcsXG4gICAgU3RvY2tEaXN0cmlidXRpb24gPSAnc3RvY2sgZGlzdHJpYnV0aW9uJyxcbiAgICBUYXggPSAndGF4JyxcbiAgICBUYXhXaXRoaGVsZCA9ICd0YXggd2l0aGhlbGQnLFxuICAgIFRyYWRlID0gJ3RyYWRlJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2ZlcicsXG4gICAgVHJhbnNmZXJGZWUgPSAndHJhbnNmZXIgZmVlJyxcbiAgICBUcnVzdEZlZSA9ICd0cnVzdCBmZWUnLFxuICAgIFVucXVhbGlmaWVkR2FpbiA9ICd1bnF1YWxpZmllZCBnYWluJyxcbiAgICBXaXRoZHJhd2FsID0gJ3dpdGhkcmF3YWwnXG59XG5cbi8qKlxuICogVmFsdWUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGBidXlgOiBCdXlpbmcgYW4gaW52ZXN0bWVudCBgc2VsbGA6IFNlbGxpbmcgYW4gaW52ZXN0bWVudCBgY2FuY2VsYDogQSBjYW5jZWxsYXRpb24gb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uIGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHdoaWNoIG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlciAgRm9yIGRlc2NyaXB0aW9ucyBvZiBwb3NzaWJsZSB0cmFuc2FjdGlvbiB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0ludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jaW52ZXN0bWVudC10cmFuc2FjdGlvbi10eXBlcy1zY2hlbWEpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQnV5ID0gJ2J1eScsXG4gICAgU2VsbCA9ICdzZWxsJyxcbiAgICBDYW5jZWwgPSAnY2FuY2VsJyxcbiAgICBDYXNoID0gJ2Nhc2gnLFxuICAgIEZlZSA9ICdmZWUnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJ1xufVxuXG4vKipcbiAqIE9iamVjdCB3aXRoIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIHNvdXJjZSBvZiBkYXRhIGZvciB0aGUgYWNjb3VudCBudW1iZXJzLCBvd25lcnMsIGFuZCBob2xkaW5ncyB0aGF0IGFyZSByZXR1cm5lZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICAgICAqL1xuICAgIG51bWJlcnM/OiBEYXRhU291cmNlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzXG4gICAgICovXG4gICAgb3duZXJzPzogRGF0YVNvdXJjZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogRGF0YVNvdXJjZXM7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNBVFM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYWNhdHM/OiBBcnJheTxOdW1iZXJzQUNBVFM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQVRPTj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhdG9uPzogQXJyYXk8TnVtYmVyc0FUT04+O1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkYHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggZGF0YSBpcyBiZWluZyByZXRyaWV2ZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXJzIGZvciB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8SW52ZXN0bWVudHNBdXRoT3duZXI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEludmVzdG1lbnRzQXV0aEdldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhdGFfc291cmNlczogSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIHRoZSBvd25lcnNoaXAgb2YgYW4gaW52ZXN0bWVudHMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGlkZW50aXR5IGluZm9ybWF0aW9uIHBlcnRhaW5zIHRvXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSW4gdGhlIGNhc2Ugb2YgYSBqb2ludCBhY2NvdW50LCBQbGFpZCB3aWxsIG1ha2UgYSBiZXN0IGVmZm9ydCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIGFsbCBhY2NvdW50IGhvbGRlcnMuICBJZiBhbiBJdGVtIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHdpdGggZGlmZmVyZW50IG93bmVyIG5hbWVzLCBzb21lIGluc3RpdHV0aW9ucyB3aWxsIHJlcG9ydCBhbGwgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGluIGVhY2ggYWNjb3VudFxcJ3MgYG5hbWVzYCBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAgICAgKi9cbiAgICBuYW1lcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIGFmdGVyIGFuIGFzeW5jaHJvbm91cyBleHRyYWN0aW9uIG9uIGFuIGludmVzdG1lbnRzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjYW5jZWxlZCB0cmFuc2FjdGlvbnMgcmVwb3J0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjYW5jZWxlZF9pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudEhvbGRpbmdzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBob2xkaW5nczogQXJyYXk8SG9sZGluZz47XG4gICAgLyoqXG4gICAgICogT2JqZWN0cyBkZXNjcmliaW5nIHRoZSBzZWN1cml0aWVzIGhlbGQgaW4gdGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gc2tpcCB3aGVuIGZldGNoaW5nIHRyYW5zYWN0aW9uIGhpc3RvcnlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaW52ZXN0bWVudHMgcHJvZHVjdCB2aWEgdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgb3B0aW9uYWxfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgYW5kIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlLCB0aGUgaW5pdGlhbCBJbnZlc3RtZW50cyBleHRyYWN0aW9uIHdpbGwgaGFwcGVuIGFzeW5jaHJvbm91c2x5LiBQbGFpZCB3aWxsIHN1YnNlcXVlbnRseSBmaXJlIGEgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rIHdoZW4gdGhlIGV4dHJhY3Rpb24gY29tcGxldGVzLiBXaGVuIGBmYWxzZWAsIFBsYWlkIHdpbGwgd2FpdCB0byByZXR1cm4gYSByZXNwb25zZSB1bnRpbCBleHRyYWN0aW9uIGNvbXBsZXRpb24gYW5kIG5vIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aWxsIGZpcmUuIE5vdGUgdGhhdCB3aGlsZSB0aGUgZXh0cmFjdGlvbiBpcyBoYXBwZW5pbmcgYXN5bmNocm9ub3VzbHksIGNhbGxzIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgd2lsbCByZXR1cm4gYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvcnMgdW50aWwgdGhlIGV4dHJhY3Rpb24gY29tcGxldGVzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYXN5bmNfdXBkYXRlPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgYmVpbmcgZmV0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBBbGwgc2VjdXJpdGllcyBmb3Igd2hpY2ggdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIHRyYW5zYWN0aW9uIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PFNlY3VyaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb25zIGJlaW5nIGZldGNoZWRcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgSXRlbVxcJ3MgcG9ydGZvbGlvIHdhcyBtYW51YWxseSBjcmVhdGVkIHdpdGggdGhlIEludmVzdG1lbnRzIEZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgbGlzdCBvZiBpbnZlc3RtZW50cyB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBQb3N0aW5nIGRhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbi4gTXVzdCBiZSBmb3JtYXR0ZWQgYXMgYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvblxcJ3MgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgc2VjdXJpdHkgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gTXVzdCBiZSBwb3NpdGl2ZSBpZiB0aGUgdHlwZSBpcyBhIGJ1eSBhbmQgbmVnYXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBzZWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBmZWVzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgYnV5YDogQnV5aW5nIGFuIGludmVzdG1lbnQgYHNlbGxgOiBTZWxsaW5nIGFuIGludmVzdG1lbnQgYGNhc2hgOiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgY2FzaCBwb3NpdGlvbiBgZmVlYDogQSBmZWUgb24gdGhlIGFjY291bnQgYHRyYW5zZmVyYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIHZhbGlkIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgY3VycmVuY3k6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VjdXJpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHNlY3VyaXR5PzogU2VjdXJpdHlPdmVycmlkZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gb24gYW4gaXNzdWUgZW5jb3VudGVyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGludGVyYWN0aW9ucyB3aXRoIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgZHVyaW5nIExpbmtpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3VlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaXNzdWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBpc3N1ZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYWZmZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBpZHMgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYWZmZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRpb24gdGltZSBvZiB0aGUgcmVjb3JkIHRyYWNraW5nIHRoaXMgaXNzdWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc2ltcGxlIHN1bW1hcnkgb2YgdGhlIGVycm9yIGZvciB0aGUgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBzdW1tYXJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBmb3IgdGhlIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgZGV0YWlsZWRfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lzc3Vlc1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJc3N1ZXNTdGF0dXM7XG59XG4vKipcbiAqIFdlYmhvb2sgbm90aWZpY2F0aW9ucyBhcmUgc2VudCBvbmx5IHdoZW4gYSBzdWJzY3JpYmVkIGlzc3VlIGlzIG1hcmtlZCBhcyByZXNvbHZlZC4gVGhlIHBheWxvYWQgY29udGFpbnMgZGV0YWlscyBhYm91dCB0aGUgaXNzdWUgYXQgdGhlIHRpbWUgb2YgaXRzIHJlc29sdXRpb24sIGZvY3VzaW5nIG9uIHRoZSBtb3N0IGVzc2VudGlhbCBpbmZvcm1hdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZVJlc29sdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElTU1VFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJU1NVRV9SRVNPTFZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29ubmVjdGl2aXR5IGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaXNzdWVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgZm9yIHRoZSBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGlzc3VlX2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgaXNzdWUgd2FzIG1hcmtlZCBhcyByZXNvbHZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGlzc3VlX3Jlc29sdmVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaW52b2x2ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaW52b2x2ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXNzdWVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpc3N1ZSB0byByZXRyaWV2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaXNzdWVfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lzc3Vlcy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXNzdWV9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNzdWU/OiBJc3N1ZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQVBJIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNTZWFyY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lzc3Vlcy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBQbGFpZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlcXVlc3RfaWRgIGZvciB0aGUgTGluayBzZXNzaW9uIHRoYXQgbWlnaHQgaGF2ZSBoYWQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX3JlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1NlYXJjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU2VhcmNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTZWFyY2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGlzc3VlcyBhZmZlY3RpbmcgdGhlIEl0ZW0sIHNlc3Npb24sIG9yIHJlcXVlc3QgcGFzc2VkIGluLCBjb25mb3JtaW5nIHRvIHRoZSBJc3N1ZXMgZGF0YSBtb2RlbC4gQW4gZW1wdHkgbGlzdCBpbmRpY2F0ZXMgdGhhdCBubyBtYXRjaGluZyBpc3N1ZXMgd2VyZSBmb3VuZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SXNzdWU+fVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGlzc3Vlcz86IEFycmF5PElzc3VlPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQVBJIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGlzc3VlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXNzdWVzU3RhdHVzIHtcbiAgICBSZXBvcnRlZCA9ICdSRVBPUlRFRCcsXG4gICAgQXdhaXRpbmdSZXNvbHV0aW9uID0gJ0FXQUlUSU5HX1JFU09MVVRJT04nLFxuICAgIEZpeEluUHJvZ3Jlc3MgPSAnRklYX0lOX1BST0dSRVNTJyxcbiAgICBGaXhQZW5kaW5nVmFsaWRhdGlvbiA9ICdGSVhfUEVORElOR19WQUxJREFUSU9OJyxcbiAgICBDYW5ub3RGaXggPSAnQ0FOTk9UX0ZJWCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnXG59XG5cbi8qKlxuICogSXNzdWVzU3Vic2NyaWJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pc3N1ZXMvc3Vic2NyaWJlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc1N1YnNjcmliZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlzc3VlIHRvIHN1YnNjcmliZSB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgaXNzdWVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgd2hlcmUgbm90aWZpY2F0aW9ucyBzaG91bGQgYmUgc2VudCB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzU3Vic2NyaWJlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lzc3Vlcy9zdWJzY3JpYmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQVBJIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgYmluYXJ5IG1hdGNoIGluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGNvdW50cnkgdGhhdCBpc3N1ZWQgdGhlIHByb3ZpZGVkIGRvY3VtZW50IG1hdGNoZXMgdGhlIGNvdW50cnkgdGhhdCB0aGUgdXNlciBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIFBsYWlkLiAgTm90ZTogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciBhIGBub19tYXRjaGAgb24gYGlzc3VpbmdfY291bnRyeWAgZmFpbHMgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIGJ5IGVkaXRpbmcgeW91ciBQbGFpZCBUZW1wbGF0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElzc3VpbmdDb3VudHJ5IHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCdcbn1cblxuLyoqXG4gKiBNZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3MgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtQXV0aE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGF1dGhfbWV0aG9kPzogSXRlbUF1dGhNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gYWNjZXNzZWQuIFRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5IHdpbGwgYmUgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGJpbGxlZF9wcm9kdWN0c2AuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGF2YWlsYWJsZV9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbiBiaWxsZWQgZm9yIHRoZSBJdGVtLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhdmFpbGFibGVfcHJvZHVjdHNgLiBOb3RlIC0gYGJpbGxlZF9wcm9kdWN0c2AgaXMgcG9wdWxhdGVkIGluIGFsbCBlbnZpcm9ubWVudHMgYnV0IG9ubHkgcmVxdWVzdHMgaW4gUHJvZHVjdGlvbiBhcmUgYmlsbGVkLiBBbHNvIG5vdGUgdGhhdCBwcm9kdWN0cyB0aGF0IGFyZSBiaWxsZWQgb24gYSBwYXktcGVyLWNhbGwgYmFzaXMgcmF0aGVyIHRoYW4gYSBwYXktcGVyLUl0ZW0gYmFzaXMsIHN1Y2ggYXMgYGJhbGFuY2VgLCB3aWxsIG5vdCBhcHBlYXIgaGVyZS4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGJpbGxlZF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhZGRlZCB0byB0aGUgSXRlbS4gSW4gYWxtb3N0IGFsbCBjYXNlcywgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBgYmlsbGVkX3Byb2R1Y3RzYCBmaWVsZC4gRm9yIHNvbWUgcHJvZHVjdHMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhbiBJdGVtIGJ1dCBub3QgeWV0IGJpbGxlZCAoZS5nLiBBc3NldHMsIGJlZm9yZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGhhcyBiZWVuIGNhbGxlZCwgb3IgQXV0aCBvciBJZGVudGl0eSB3aGVuIGFkZGVkIGFzIE9wdGlvbmFsIFByb2R1Y3RzIGJ1dCBiZWZvcmUgdGhlaXIgZW5kcG9pbnRzIGhhdmUgYmVlbiBjYWxsZWQpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9kdWN0IG1heSBhcHBlYXIgaW4gYHByb2R1Y3RzYCBidXQgbm90IGluIGBiaWxsZWRfcHJvZHVjdHNgLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoaXMgd2lsbCBjb25zaXN0IG9mIGFsbCBwcm9kdWN0cyB3aGVyZSBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gdGhlIHJlcXVpcmVkIGRhdGEgc2NvcGVzIGZvciB0aGF0IHByb2R1Y3QgYW5kIHlvdSBoYXZlIFByb2R1Y3Rpb24gYWNjZXNzIGZvciB0aGF0IHByb2R1Y3QuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIElmIHRoZSBJdGVtIGRvZXMgbm90IGhhdmUgY29uc2VudCBleHBpcmF0aW9uIHNjaGVkdWxlZCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gQ3VycmVudGx5LCBvbmx5IGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgYW5kIGEgc21hbGwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgaGF2ZSBleHBpcmluZyBjb25zZW50LiBDbG9zZXIgdG8gdGhlIDEwMzMgY29tcGxpYW5jZSBkZWFkbGluZSBvZiBBcHJpbCAxLCAyMDI2LCBleHBpcmF0aW9uIHRpbWVzIHdpbGwgYmUgcG9wdWxhdGVkIG1vcmUgd2lkZWx5LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZyBjb25zZW50IGV4cGlyYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLyNjb25zZW50LWV4cGlyYXRpb24tYW5kLXJlYXV0aG9yaXphdGlvbi4pXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdGhlIGNhc2UgZm9yIEl0ZW1zIHdpdGggc29tZSBmb3JtcyBvZiB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uLiAgYGJhY2tncm91bmRgIC0gSXRlbSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCAgYHVzZXJfcHJlc2VudF9yZXF1aXJlZGAgLSBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVfdHlwZTogSXRlbVVwZGF0ZVR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEl0ZW1VcGRhdGVUeXBlRW51bSB7XG4gICAgQmFja2dyb3VuZCA9ICdiYWNrZ3JvdW5kJyxcbiAgICBVc2VyUHJlc2VudFJlcXVpcmVkID0gJ3VzZXJfcHJlc2VudF9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWN0aXZpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY3Rpdml0aWVzOiBBcnJheTxBY3Rpdml0eT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRpbWVzdGFtcHMgZm9yIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhIHR5cGUgd2FzIGFjY2Vzc2VkIHBlciBhcHBsaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGFzdERhdGFBY2Nlc3NUaW1lcz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3RfZGF0YV9hY2Nlc3NfdGltZXM6IEFycmF5PExhc3REYXRhQWNjZXNzVGltZXM+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHVzZXIgc3VjY2Vzc2Z1bGx5IGFkZHMgYSBQbGFpZCBJdGVtIGR1cmluZyBhIExpbmsgc2Vzc2lvbiB3aGVuIHVzaW5nIEhvc3RlZCBMaW5rIG9yIE11bHRpLUl0ZW0gTGluayBzZXNzaW9ucy4gQ29udGFpbnMgdGhlIHB1YmxpYyB0b2tlbiBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFkZFJlc3VsdFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSU5LYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElURU1fQUREX1JFU1VMVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVibGljIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGl0ZW0gdGhhdCB3YXMgYWRkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBjb25uZWN0ZWQgYXBwbGljYXRpb25zIGZvciBhIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29ubmVjdGVkIGFwcGxpY2F0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENvbm5lY3RlZEFwcGxpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb25zOiBBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvbj47XG59XG4vKipcbiAqIFVzZXIgYXV0aGVudGljYXRpb24gcGFyYW1ldGVycywgZm9yIGNsaWVudHMgbWFraW5nIGEgcmVxdWVzdCB3aXRob3V0IGFuIGBhY2Nlc3NfdG9rZW5gLiBUaGlzIGlzIG9ubHkgYWxsb3dlZCBmb3Igc2VsZWN0IGNsaWVudHMgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlLiBNb3N0IGNsaWVudHMgc2hvdWxkIGNhbGwgL2l0ZW0vaW1wb3J0IHRvIG9idGFpbiBhbiBhY2Nlc3MgdG9rZW4gYmVmb3JlIG1ha2luZyBhIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RVc2VyQXV0aCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IHVzZXJuYW1lIGhhc2hlZCBieSBGSS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICBmaV91c2VybmFtZV9oYXNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY29wZXM6IFNjb3BlcztcbiAgICAvKipcbiAgICAgKiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCBkdXJpbmcgZW5yb2xsbWVudCwgdGhpcyBmaWVsZCBtdXN0IGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBzdGF0ZSBzZW50IHRvIHRoZSBwYXJ0bmVyIGluIHRoZSBPQXV0aCBMb2dpbiBVUkkuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgd2hlbiB0aGUgY29udGV4dCBpcyBgRU5ST0xMTUVOVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNDb250ZXh0fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29udGV4dDogU2NvcGVzQ29udGV4dDtcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vc2NvcGVzL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rL2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGlua2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbWV0aG9kIHVzZWQgdG8gcG9wdWxhdGUgQXV0aCBkYXRhIGZvciB0aGUgSXRlbS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgSXRlbXMgdGhhdCBoYXZlIGhhZCBBdXRoIG51bWJlcnMgZGF0YSBzZXQgb24gYXQgbGVhc3Qgb25lIG9mIGl0cyBhY2NvdW50cywgYW5kIHdpbGwgYmUgYG51bGxgIG90aGVyd2lzZS4gRm9yIGluZm8gYWJvdXQgdGhlIHZhcmlvdXMgZmxvd3MsIHNlZSBvdXIgW0F1dGggY292ZXJhZ2UgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuICBgSU5TVEFOVF9BVVRIYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXJcXCdzIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24uICBgSU5TVEFOVF9NQVRDSGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgSW5zdGFudCBNYXRjaCBmYWxsYmFjayBmbG93LiAgYEFVVE9NQVRFRF9NSUNST0RFUE9TSVRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgZmxvdy4gIGBTQU1FX0RBWV9NSUNST0RFUE9TSVRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93LiAgYElOU1RBTlRfTUlDUk9ERVBPU0lUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgSW5zdGFudCBNaWNyby1kZXBvc2l0cyBmbG93LiAgYERBVEFCQVNFX01BVENIYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBEYXRhYmFzZSBNYXRjaCBmbG93LiAgYERBVEFCQVNFX0lOU0lHSFRTYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIHRoZSBEYXRhYmFzZSBJbnNpZ2h0cyBmbG93LiAgYFRSQU5TRkVSX01JR1JBVEVEYDogVGhlIEl0ZW1cXCdzIEF1dGggZGF0YSB3YXMgcHJvdmlkZWQgdmlhIFtgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zZmVyL2FjY291bnQtbGlua2luZy8jbWlncmF0ZS1hY2NvdW50LWludG8tdHJhbnNmZXJzKS4gIGBJTlZFU1RNRU5UU19GQUxMQkFDS2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgZm9yIEludmVzdG1lbnRzIE1vdmUgd2FzIHByb3ZpZGVkIHZpYSBhIFtmYWxsYmFjayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2ludmVzdG1lbnRzLW1vdmUvI2ZhbGxiYWNrLWZsb3dzKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1BdXRoTWV0aG9kIHtcbiAgICBJbnN0YW50QXV0aCA9ICdJTlNUQU5UX0FVVEgnLFxuICAgIEluc3RhbnRNYXRjaCA9ICdJTlNUQU5UX01BVENIJyxcbiAgICBBdXRvbWF0ZWRNaWNyb2RlcG9zaXRzID0gJ0FVVE9NQVRFRF9NSUNST0RFUE9TSVRTJyxcbiAgICBTYW1lRGF5TWljcm9kZXBvc2l0cyA9ICdTQU1FX0RBWV9NSUNST0RFUE9TSVRTJyxcbiAgICBJbnN0YW50TWljcm9kZXBvc2l0cyA9ICdJTlNUQU5UX01JQ1JPREVQT1NJVFMnLFxuICAgIERhdGFiYXNlTWF0Y2ggPSAnREFUQUJBU0VfTUFUQ0gnLFxuICAgIERhdGFiYXNlSW5zaWdodHMgPSAnREFUQUJBU0VfSU5TSUdIVFMnLFxuICAgIFRyYW5zZmVyTWlncmF0ZWQgPSAnVFJBTlNGRVJfTUlHUkFURUQnLFxuICAgIEludmVzdG1lbnRzRmFsbGJhY2sgPSAnSU5WRVNUTUVOVFNfRkFMTEJBQ0snXG59XG5cbi8qKlxuICogQSBkYXRhIHNjb3BlIGZvciB0aGUgcHJvZHVjdHMgdGhhdCBhIHVzZXIgY2FuIGNvbnNlbnQgdG8gaW4gW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSXRlbUNvbnNlbnRlZERhdGFTY29wZSB7XG4gICAgQWNjb3VudEFuZEJhbGFuY2VJbmZvID0gJ2FjY291bnRfYW5kX2JhbGFuY2VfaW5mbycsXG4gICAgQ29udGFjdEluZm8gPSAnY29udGFjdF9pbmZvJyxcbiAgICBBY2NvdW50QW5kUm91dGluZ051bWJlcnMgPSAnYWNjb3VudF9hbmRfcm91dGluZ19udW1iZXJzJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAndHJhbnNhY3Rpb25zJyxcbiAgICBDcmVkaXRBbmRMb2FucyA9ICdjcmVkaXRfYW5kX2xvYW5zJyxcbiAgICBJbnZlc3RtZW50cyA9ICdpbnZlc3RtZW50cycsXG4gICAgQmFua1N0YXRlbWVudHMgPSAnYmFua19zdGF0ZW1lbnRzJyxcbiAgICBSaXNrSW5mbyA9ICdyaXNrX2luZm8nXG59XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgdGhlIGVudGl0eSBhdXRoZW50aWNhdGluZyB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbiB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEYXRhUGFydG5lciA9ICdEQVRBX1BBUlRORVInLFxuICAgIFBsYWlkID0gJ1BMQUlEJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgd2l0aCBhbiBJdGVtLiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFUlJPUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2dldGAgYW5kIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVdpdGhDb25zZW50RmllbGRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtV2l0aENvbnNlbnRGaWVsZHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzPzogSXRlbVN0YXR1c051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2ltcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcHJvZHVjdCBzdHJpbmdzXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRofVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfYXV0aDogSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUltcG9ydFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJdGVtSW1wb3J0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBjb25maWd1cmUgYC9pdGVtL2ltcG9ydGAgcmVxdWVzdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCBhbiBJdGVtLiBQbGFpZCBmaXJlcyBhIHdlYmhvb2sgaWYgY3JlZGVudGlhbHMgZmFpbC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogT2JqZWN0IG9mIHVzZXIgSUQgYW5kIGF1dGggdG9rZW4gcGFpciwgcGVybWl0dGluZyBQbGFpZCB0byBhZ2dyZWdhdGUgYSB1c2Vy4oCZcyBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aCB7XG4gICAgLyoqXG4gICAgICogT3BhcXVlIHVzZXIgaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXV0aG9yaXphdGlvbiB0b2tlbiBQbGFpZCB3aWxsIHVzZSB0byBhZ2dyZWdhdGUgdGhpcyB1c2Vy4oCZcyBhY2NvdW50c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGhcbiAgICAgKi9cbiAgICBhdXRoX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1JbXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBoYXMgZXhpdGVkIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgd2l0aG91dCB0aGUgdXNlciBoYXZpbmcgZ29uZSB0aHJvdWdoIHRoZSB1cGRhdGUgbW9kZSBmbG93IGluIHlvdXIgYXBwICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIHVzZXIgY29tcGxldGVkIHRoZSB1cGRhdGUgbW9kZSBpbiBhIGRpZmZlcmVudCBhcHApLiBJZiB5b3UgaGF2ZSBtZXNzYWdpbmcgdGhhdCB0ZWxscyB0aGUgdXNlciB0byBjb21wbGV0ZSB0aGUgdXBkYXRlIG1vZGUgZmxvdywgeW91IHNob3VsZCBzaWxlbmNlIHRoaXMgbWVzc2FnaW5nIHVwb24gcmVjZWl2aW5nIHRoZSBgTE9HSU5fUkVQQUlSRURgIHdlYmhvb2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExPR0lOX1JFUEFJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgb25jZSBQbGFpZCBjYWxjdWxhdGVzIGluY29tZSBmcm9tIGFuIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9SRUFEWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgcHVibGljX3Rva2VuYCBmb3IgdGhlIHBhcnRpY3VsYXIgSXRlbSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYGFjY2Vzc190b2tlbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgYHB1YmxpY190b2tlbmAsIG9idGFpbmVkIGZyb20gdGhlIExpbmsgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb3IgYC9zYW5kYm94L2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIHZhbHVlIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV0dXJuZWQgYGFjY2Vzc190b2tlbmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1SZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0xhc3RXZWJob29rfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RzIHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBmYWlsZWQgaW52ZXN0bWVudHMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGxhc3RfZmFpbGVkX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHdlYmhvb2sgZmlyZWQgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzTGFzdFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSB3ZWJob29rIHdhcyBmaXJlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgc2VudF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3Qgd2ViaG9vayBjb2RlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gICAgICovXG4gICAgY29kZV9zZW50Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzSW52ZXN0bWVudHN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogSXRlbVN0YXR1c0ludmVzdG1lbnRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c051bGxhYmxlXG4gICAgICovXG4gICAgbGFzdF93ZWJob29rPzogSXRlbVN0YXR1c0xhc3RXZWJob29rIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdHJhbnNhY3Rpb25zIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS4gVGhpcyBmaWVsZCBkb2VzIG5vdCByZWZsZWN0IHRyYW5zYWN0aW9ucyB1cGRhdGVzIHBlcmZvcm1lZCBieSBub24tVHJhbnNhY3Rpb25zIHByb2R1Y3RzIChlLmcuIFNpZ25hbCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBmYWlscyBhbiBhdHRlbXB0IHRvIGNvbm5lY3Qgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBJdGVtLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYW4gSXRlbSwgc2V0IHRvIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBGaWVsZCBpcyBgbnVsbGAgZm9yIEl0ZW1zIGNyZWF0ZWQgd2l0aG91dCBhbiBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLCBzdWNoIGFzIEl0ZW1zIGNyZWF0ZWQgdmlhIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtQXV0aE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgYXV0aF9tZXRob2Q/OiBJdGVtQXV0aE1ldGhvZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGhhdmUgYmVlbiBiaWxsZWQgZm9yIHRoZSBJdGVtLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBhdmFpbGFibGVfcHJvZHVjdHNgLiBOb3RlIC0gYGJpbGxlZF9wcm9kdWN0c2AgaXMgcG9wdWxhdGVkIGluIGFsbCBlbnZpcm9ubWVudHMgYnV0IG9ubHkgcmVxdWVzdHMgaW4gUHJvZHVjdGlvbiBhcmUgYmlsbGVkLiBBbHNvIG5vdGUgdGhhdCBwcm9kdWN0cyB0aGF0IGFyZSBiaWxsZWQgb24gYSBwYXktcGVyLWNhbGwgYmFzaXMgcmF0aGVyIHRoYW4gYSBwYXktcGVyLUl0ZW0gYmFzaXMsIHN1Y2ggYXMgYGJhbGFuY2VgLCB3aWxsIG5vdCBhcHBlYXIgaGVyZS4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgYmlsbGVkX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGFkZGVkIHRvIHRoZSBJdGVtLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGBiaWxsZWRfcHJvZHVjdHNgIGZpZWxkLiBGb3Igc29tZSBwcm9kdWN0cywgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBwcm9kdWN0IHRvIGJlIGFkZGVkIHRvIGFuIEl0ZW0gYnV0IG5vdCB5ZXQgYmlsbGVkIChlLmcuIEFzc2V0cywgYmVmb3JlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgaGFzIGJlZW4gY2FsbGVkLCBvciBBdXRoIG9yIElkZW50aXR5IHdoZW4gYWRkZWQgYXMgT3B0aW9uYWwgUHJvZHVjdHMgYnV0IGJlZm9yZSB0aGVpciBlbmRwb2ludHMgaGF2ZSBiZWVuIGNhbGxlZCksIGluIHdoaWNoIGNhc2UgdGhlIHByb2R1Y3QgbWF5IGFwcGVhciBpbiBgcHJvZHVjdHNgIGJ1dCBub3QgaW4gYGJpbGxlZF9wcm9kdWN0c2AuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpLiBUaGlzIHdpbGwgY29uc2lzdCBvZiBhbGwgcHJvZHVjdHMgd2hlcmUgYm90aCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOiB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIHRoZSByZXF1aXJlZCBkYXRhIHNjb3BlcyBmb3IgdGhhdCBwcm9kdWN0IGFuZCB5b3UgaGF2ZSBQcm9kdWN0aW9uIGFjY2VzcyBmb3IgdGhhdCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuIElmIHRoZSBJdGVtIGRvZXMgbm90IGhhdmUgY29uc2VudCBleHBpcmF0aW9uIHNjaGVkdWxlZCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gQ3VycmVudGx5LCBvbmx5IGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgYW5kIGEgc21hbGwgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgaGF2ZSBleHBpcmluZyBjb25zZW50LiBDbG9zZXIgdG8gdGhlIDEwMzMgY29tcGxpYW5jZSBkZWFkbGluZSBvZiBBcHJpbCAxLCAyMDI2LCBleHBpcmF0aW9uIHRpbWVzIHdpbGwgYmUgcG9wdWxhdGVkIG1vcmUgd2lkZWx5LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZyBjb25zZW50IGV4cGlyYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLyNjb25zZW50LWV4cGlyYXRpb24tYW5kLXJlYXV0aG9yaXphdGlvbi4pXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYW4gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWQsIHdoaWNoIGNhbiBiZSB0aGUgY2FzZSBmb3IgSXRlbXMgd2l0aCBzb21lIGZvcm1zIG9mIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24uICBgYmFja2dyb3VuZGAgLSBJdGVtIGNhbiBiZSB1cGRhdGVkIGluIHRoZSBiYWNrZ3JvdW5kICBgdXNlcl9wcmVzZW50X3JlcXVpcmVkYCAtIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1XaXRoQ29uc2VudEZpZWxkc1VwZGF0ZVR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIEl0ZW0gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB1c2UgY2FzZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gICBZb3UgY2FuIHNlZSB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyBvciB1cGRhdGUgdGhlIGxpc3Qgb2YgdXNlIGNhc2VzIHRvIHJlcXVlc3QgYXQgYW55IHRpbWUgdmlhIHRoZSBMaW5rIEN1c3RvbWl6YXRpb24gc2VjdGlvbiBvZiB0aGUgW1BsYWlkIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktdjUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBgY29uc2VudGVkX3Byb2R1Y3RzYDsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGNvbnNlbnRlZF9kYXRhX3Njb3Blcz86IEFycmF5PEl0ZW1Db25zZW50ZWREYXRhU2NvcGU+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1VwZGF0ZVR5cGVFbnVtIHtcbiAgICBCYWNrZ3JvdW5kID0gJ2JhY2tncm91bmQnLFxuICAgIFVzZXJQcmVzZW50UmVxdWlyZWQgPSAndXNlcl9wcmVzZW50X3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBJdGVtIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2ZcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB1c2UgY2FzZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gICBZb3UgY2FuIHNlZSB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyBvciB1cGRhdGUgdGhlIGxpc3Qgb2YgdXNlIGNhc2VzIHRvIHJlcXVlc3QgYXQgYW55IHRpbWUgdmlhIHRoZSBMaW5rIEN1c3RvbWl6YXRpb24gc2VjdGlvbiBvZiB0aGUgW1BsYWlkIERhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktdjUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZlxuICAgICAqL1xuICAgIGNvbnNlbnRlZF91c2VfY2FzZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBkYXRhIHNjb3BlcyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpLiBUaGVzZSBhcmUgYmFzZWQgb24gdGhlIGBjb25zZW50ZWRfcHJvZHVjdHNgOyBzZWUgdGhlIFtmdWxsIG1hcHBpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jZGF0YS1zY29wZXMtYnktcHJvZHVjdCkgb2YgZGF0YSBzY29wZXMgYW5kIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxJdGVtQ29uc2VudGVkRGF0YVNjb3BlPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2ZcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfZGF0YV9zY29wZXM/OiBBcnJheTxJdGVtQ29uc2VudGVkRGF0YVNjb3BlPjtcbn1cbi8qKlxuICogQSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFtKV1QgbGlicmFyaWVzXShodHRwczovL2p3dC5pby8jbGlicmFyaWVzLWlvKSB0byB2ZXJpZnkgUGxhaWQgd2ViaG9va3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldLUHVibGljS2V5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldLUHVibGljS2V5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWxnIG1lbWJlciBpZGVudGlmaWVzIHRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBmYW1pbHkgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgYWxnOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNydiBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBjdXJ2ZSB1c2VkIHdpdGggdGhlIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBjcnY6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga2lkIChLZXkgSUQpIG1lbWJlciBjYW4gYmUgdXNlZCB0byBtYXRjaCBhIHNwZWNpZmljIGtleS4gVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGluc3RhbmNlLCB0byBjaG9vc2UgYW1vbmcgYSBzZXQgb2Yga2V5cyB3aXRoaW4gdGhlIEpXSyBkdXJpbmcga2V5IHJvbGxvdmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGtpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBrdHkgKGtleSB0eXBlKSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LCBzdWNoIGFzIFJTQSBvciBFQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBrdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlIChwdWJsaWMga2V5IHVzZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGludGVuZGVkIHVzZSBvZiB0aGUgcHVibGljIGtleS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICB1c2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgeCBtZW1iZXIgY29udGFpbnMgdGhlIHggY29vcmRpbmF0ZSBmb3IgdGhlIGVsbGlwdGljIGN1cnZlIHBvaW50LCBwcm92aWRlZCBhcyBhIGJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyBvZiB0aGUgY29vcmRpbmF0ZVxcJ3MgYmlnIGVuZGlhbiByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICB4OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHkgbWVtYmVyIGNvbnRhaW5zIHRoZSB5IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUga2V5IHdhcyBjcmVhdGVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgd2hlbiB0aGUga2V5IGV4cGlyZWQsIGluIFVuaXggdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBleHBpcmVkX2F0OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBIEpXVCBIZWFkZXIsIHVzZWQgZm9yIHdlYmhvb2sgdmFsaWRhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBKV1RIZWFkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKV1RIZWFkZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldUSGVhZGVyXG4gICAgICovXG4gICAga2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldUSGVhZGVyXG4gICAgICovXG4gICAgYWxnOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGFkZHJlc3NgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BPQm94U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgcG9fYm94OiBQT0JveFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc1B1cnBvc2VMYWJlbH1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHR5cGU6IEFkZHJlc3NQdXJwb3NlTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgY2l0eT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICByZWdpb24/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIGludGVybmF0aW9uYWxfZGV0YWlscz86IEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgZGF0ZV9vZl9iaXJ0aGAgZmllbGQgbWF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBkYXk/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICAgICAqL1xuICAgIG1vbnRoPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICB5ZWFyPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGBreWNfY2hlY2tgIChEYXRhIFNvdXJjZSBWZXJpZmljYXRpb24pIHN0ZXAuIFRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBzdGVwcy5reWNfY2hlY2tgIGhhcyByZWFjaGVkIGEgdGVybWluYWwgc3RhdGUgb2YgZWl0aGVyIGBzdWNjZXNzYCBvciBgZmFpbGVkYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBga3ljX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmt5Y19jaGVja2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrQWRkcmVzc1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGFkZHJlc3M6IEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrTmFtZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IEtZQ0NoZWNrTmFtZVN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tJRE51bWJlclN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogS1lDQ2hlY2tJRE51bWJlclN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrUGhvbmVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IEtZQ0NoZWNrUGhvbmVTdW1tYXJ5O1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkIGZvciBmaWVsZHMgdGhhdCBhcmUgb25seSBwcmVzZW50IG9uIGFuIGludGVybmF0aW9uYWwgS1lDIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAgICAgKi9cbiAgICBidWlsZGluZzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHk6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgZGlzdHJpY3Q6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgaG91c2VfbnVtYmVyOiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIHN1YnByZW1pc2U6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgdGhvcm91Z2hmYXJlOiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBpZF9udW1iZXJgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYG5hbWVgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja05hbWVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tOYW1lU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tOYW1lU3VtbWFyeVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgcGhvbmVgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tQaG9uZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5XG4gICAgICovXG4gICAgYXJlYV9jb2RlOiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGxhc3QgdGltZSBlYWNoIGRhdGF0eXBlIHdhcyBhY2Nlc3NlZCBieSBhbiBhcHBsaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhcHBsaWNhdGlvbiBhY2Nlc3NpbmcgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfYmFsYW5jZV9pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFjY291bnRfYmFsYW5jZV9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgYWNjb3VudF9yb3V0aW5nX251bWJlciB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X3JvdXRpbmdfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY29udGFjdF9kZXRhaWxzIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGNvbnRhY3RfZGV0YWlsczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIHRyYW5zYWN0aW9ucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBjcmVkaXRfYW5kX2xvYW5zIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGNyZWRpdF9hbmRfbG9hbnM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBpbnZlc3RtZW50cyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIHBheXJvbGxfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luZm86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbl9yaXNrX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fcmlza19pbmZvOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBvZiB0eXBlIGBMSUFCSUxJVElFU2AgYW5kIGNvZGUgYERFRkFVTFRfVVBEQVRFYCB3aWxsIGJlIGZpcmVkIHdoZW4gbmV3IG9yIHVwZGF0ZWQgbGlhYmlsaXRpZXMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGEgbGlhYmlsaXRpZXMgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSUFCSUxJVElFU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBcXCdzIGZvciBhY2NvdW50cyB0aGF0IGNvbnRhaW4gbmV3IGxpYWJpbGl0aWVzLlxcJ1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF9uZXdfbGlhYmlsaXRpZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdpdGgga2V5cyBvZiBgYWNjb3VudF9pZGBcXCdzIHRoYXQgYXJlIG1hcHBlZCB0byB0aGVpciByZXNwZWN0aXZlIGxpYWJpbGl0aWVzIGZpZWxkcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwicGFzdF9hbW91bnRfZHVlXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfdXBkYXRlZF9saWFiaWxpdGllczogeyBba2V5OiBzdHJpbmddOiBBcnJheTxzdHJpbmc+OyB9O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2xpYWJpbGl0aWVzL2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIGBvcHRpb25zYCBjYW5ub3QgYmUgbnVsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW1cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbGlhYmlsaXR5IGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVkaXQgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIGNyZWRpdDogQXJyYXk8Q3JlZGl0Q2FyZExpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3J0Z2FnZSBhY2NvdW50cyByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc09iamVjdFxuICAgICAqL1xuICAgIG1vcnRnYWdlOiBBcnJheTxNb3J0Z2FnZUxpYWJpbGl0eT4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHVkZW50IGxvYW4gYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFN0dWRlbnRMb2FuPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBzdHVkZW50OiBBcnJheTxTdHVkZW50TG9hbj4gfCBudWxsO1xufVxuLyoqXG4gKiBVc2VkIHRvIGNvbmZpZ3VyZSBTYW5kYm94IHRlc3QgZGF0YSBmb3IgdGhlIExpYWJpbGl0aWVzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdHlPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGxpYWJpbGl0eSBvYmplY3QsIGVpdGhlciBgY3JlZGl0YCBvciBgc3R1ZGVudGAuIE1vcnRnYWdlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlIGN1c3RvbSBTYW5kYm94LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdXJjaGFzZSBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gRm9yIHNpbXBsaWNpdHksIHRoaXMgaXMgdGhlIG9ubHkgaW50ZXJlc3QgcmF0ZSB1c2VkIHRvIGNhbGN1bGF0ZSBpbnRlcmVzdCBjaGFyZ2VzLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHVyY2hhc2VfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNhc2ggQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjYXNoX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYWxhbmNlIHRyYW5zZmVyIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgYmFsYW5jZV90cmFuc2Zlcl9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lhbCBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHNwZWNpYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsYXN0X3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYG1pbmltdW1fcGF5bWVudF9hbW91bnRgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgIG9yIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG1pbmltdW1fcGF5bWVudF9hbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGlzX292ZXJkdWVgIGZpZWxkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBsb2FuIHByaW5jaXBhbC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwcmluY2lwYWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbm9taW5hbF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIGludGVyZXN0IGNhcGl0YWxpemF0aW9uIGJlZ2lucyBhdCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1vbnRocyBhZnRlciBsb2FuIG9yaWdpbmF0aW9uLiBCeSBkZWZhdWx0IGludGVyZXN0IGlzIG5ldmVyIGNhcGl0YWxpemVkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGludGVyZXN0X2NhcGl0YWxpemF0aW9uX2dyYWNlX3BlcmlvZF9tb250aHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbH1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfbW9kZWw6IFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWw7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBleHBlY3RlZF9wYXlvZmZfZGF0ZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZXhwZWN0ZWRfcGF5b2ZmX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGd1YXJhbnRvcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgZ3VhcmFudG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19mZWRlcmFsYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNfZmVkZXJhbDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYGxvYW5fbmFtZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgbG9hbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fc3RhdHVzOiBTdHVkZW50TG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BTTEZTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwc2xmX3N0YXR1czogUFNMRlN0YXR1cztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLmRlc2NyaXB0aW9uYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXBheW1lbnRfcGxhbl9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgcmVwYXltZW50X3BsYW4udHlwZWAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBgXFxcImV4dGVuZGVkIGdyYWR1YXRlZFxcXCJgLCBgXFxcImV4dGVuZGVkIHN0YW5kYXJkXFxcImAsIGBcXFwiZ3JhZHVhdGVkXFxcImAsIGBcXFwiaW5jb21lLWNvbnRpbmdlbnQgcmVwYXltZW50XFxcImAsIGBcXFwiaW5jb21lLWJhc2VkIHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1zZW5zaXRpdmUgcmVwYXltZW50XFxcImAsIGBcXFwiaW50ZXJlc3Qgb25seVxcXCJgLCBgXFxcIm90aGVyXFxcImAsIGBcXFwicGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwicmV2aXNlZCBwYXkgYXMgeW91IGVhcm5cXFwiYCwgYFxcXCJzdGFuZGFyZFxcXCJgLCBvciBgXFxcInNhdmluZyBvbiBhIHZhbHVhYmxlIGVkdWNhdGlvblxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgc2VxdWVuY2VfbnVtYmVyYCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZXJ2aWNlcl9hZGRyZXNzOiBBZGRyZXNzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtDYWxsYmFja01ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBjYWxsYmFja190eXBlPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NhbGxiYWNrVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0V2ZW50TmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBldmVudF9uYW1lPzogTGlua0V2ZW50TmFtZTtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hlcmUgaW4gdGhlIGZsb3cgdGhlIExpbmsgdXNlciBleGl0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rQ2FsbGJhY2tNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uPzogTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGFjY291bnRzIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50cz86IEFycmF5PExpbmtEZWxpdmVyeUFjY291bnQ+O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFjY291bnQgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBJdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IExpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJZiBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBpcyBiZWluZyB1c2VkLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBiZWluZyB2ZXJpZmllZCBpcyBhIGBidXNpbmVzc2Agb3IgYHBlcnNvbmFsYCBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBjbGFzc190eXBlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rIGNvbnRhaW5pbmcgbWV0YWRhdGEgcHJveGllZCBvdmVyIGZyb20gTGluayBjYWxsYmFjayBlLmcgYG9uRXZlbnRgLCBgb25FeGl0YCwgYG9uU3VjY2Vzc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYExJTktfQ0FMTEJBQ0tgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtDYWxsYmFja01ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2NhbGxiYWNrX21ldGFkYXRhOiBMaW5rQ2FsbGJhY2tNZXRhZGF0YTtcbn1cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIGNvbnRhaW5pbmcgYm90aCB0aGUgdHlwZSBhbmQgYWRkcmVzcyB0byBzZW5kIHRoZSBVUkwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBtZXRob2Q/OiBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIC8gZW1haWwgYWRkcmVzcyB0aGF0IEhvc3RlZCBMaW5rIHNlc3Npb25zIGFyZSBkZWxpdmVyZWQgdG8uIFBob25lIG51bWJlcnMgbXVzdCBiZSBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBMaW5rRGVsaXZlcnlPcHRpb25zO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24sIHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGVsaXZlcnkgbWV0aG9kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLiBTYW1lIGFzIHRoZSBgbGlua190b2tlbmAgc3RyaW5nIGV4Y2x1ZGluZyB0aGUgXFxcImxpbmste2Vudn0tXFxcIiBwcmVmaXguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZWxpdmVyeSBtZXRob2QgdG8gYmUgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTC4gIGBTTVNgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggU01TICBgRU1BSUxgOiBUaGUgVVJMIHdpbGwgYmUgZGVsaXZlcmVkIHRocm91Z2ggZW1haWxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kIHtcbiAgICBTbXMgPSAnU01TJyxcbiAgICBFbWFpbCA9ICdFTUFJTCdcbn1cblxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfc2Vzc2lvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVNlc3Npb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNyZWF0ZWQgYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gSG9zdGVkIExpbmsgc2Vzc2lvbiB3YXMgY29tcGxldGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBcXCdXZWxscyBGYXJnb1xcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHJlbGF0ZWQgdG8gdGhlIGRlbGl2ZXJ5IG9mIHRoZSBsaW5rIHNlc3Npb24gdG8gdXNlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlNZXRhZGF0YVxuICAgICAqL1xuICAgIGNvbW11bmljYXRpb25fbWV0aG9kPzogTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tEZWxpdmVyeVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkZWxpdmVyeV9zdGF0dXM/OiBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXM7XG59XG4vKipcbiAqIE9wdGlvbmFsIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU9wdGlvbnNcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBMaW5rRGVsaXZlcnlSZWNpcGllbnQ7XG59XG4vKipcbiAqIE1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIHJlY2lwaWVudC4gSWYgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHBvcHVsYXRlIHRoaXMgZmllbGQgaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgaXQgYmxhbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeVJlY2lwaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgY29tbXVuaWNhdGlvbiBtZXRob2RzIHRvIHNlbmQgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24gVVJMIHRvLiBJZiBkZWxpdmVyeSBpcyBub3QgcmVxdWlyZWQsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZHM/OiBBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPjtcbiAgICAvKipcbiAgICAgKiBGaXJzdCBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdpbGwgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwgLyB0ZXh0IChpZiBjb25maWd1cmVkKS4gSWYgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeVJlY2lwaWVudFxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24uICBgQ1JFQVRFRGA6IFRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQgYnV0IG5vdCB5ZXQgYWNjZXNzZWQgYnkgdGhlIHVzZXIgIGBPUEVORURgOiBUaGUgc2Vzc2lvbiBpcyBvcGVuZWQgYnkgdGhlIHVzZXIgYnV0IG5vdCB5ZXQgY29tcGxldGVkICBgRVhJVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gZXhpdGVkIGJ5IHRoZSB1c2VyICBgQ09NUExFVEVEYDogVGhlIHNlc3Npb24gaGFzIGJlZW4gY29tcGxldGVkIGJ5IHRoZSB1c2VyICBgRVhQSVJFRGA6IFRoZSBzZXNzaW9uIGhhcyBleHBpcmVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzIHtcbiAgICBDcmVhdGVkID0gJ0NSRUFURUQnLFxuICAgIE9wZW5lZCA9ICdPUEVORUQnLFxuICAgIEV4aXRlZCA9ICdFWElURUQnLFxuICAgIENvbXBsZXRlZCA9ICdDT01QTEVURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGVuZGluZyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wZW5kaW5nJ1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIExpbmsgY2FsbGJhY2sgZXZlbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGUge1xuICAgIFN1Y2Nlc3MgPSAnT05fU1VDQ0VTUycsXG4gICAgRXZlbnQgPSAnT05fRVZFTlQnLFxuICAgIEV4aXQgPSAnT05fRVhJVCdcbn1cblxuLyoqXG4gKiBUaGUgY29tbXVuaWNhdGlvbiBtZXRob2QgdXNlZCB0byBkZWxpdmVyIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgU21zID0gJ1NNUycsXG4gICAgRW1haWwgPSAnRU1BSUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZGVsaXZlcnkgb2YgdGhlIEhvc3RlZCBMaW5rIHRvIHRoZSB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnU1VDQ0VTUycsXG4gICAgRmFpbHVyZSA9ICdGQUlMVVJFJ1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRXZlbnQge1xuICAgIC8qKlxuICAgICAqIEV2ZW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVVUlEIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVkdXBsaWNhdGUgZXZlbnRzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0V2ZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X21ldGFkYXRhOiBMaW5rRXZlbnRNZXRhZGF0YTtcbn1cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgYW4gZXZlbnQgdGhhdCBvY2N1cnJlZCB3aGlsZSB0aGUgdXNlciB3YXMgZ29pbmcgdGhyb3VnaCBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIHRoYXQgdGhlIHVzZXIgZW5jb3VudGVyZWQuIEVtaXR0ZWQgYnkgYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgbWVzc2FnZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciB0eXBlIHRoYXQgdGhlIHVzZXIgZW5jb3VudGVyZWQuIEVtaXR0ZWQgYnk6IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBrZXkgaW5kaWNhdGVzIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgdXNlciBleGl0ZWQgdGhlIExpbmsgZmxvdy4gRW1pdHRlZCBieTogYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXhpdF9zdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBzZWxlY3RlZCBpbnN0aXR1dGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBzZWxlY3RlZCBpbnN0aXR1dGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHF1ZXJ5IHVzZWQgdG8gc2VhcmNoIGZvciBpbnN0aXR1dGlvbnMuIEVtaXR0ZWQgYnk6IGBTRUFSQ0hfSU5TVElUVVRJT05gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fc2VhcmNoX3F1ZXJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgU3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLiBFbWl0dGVkIGJ5OiBhbGwgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIGhhcyBlbmNvdW50ZXJlZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBNRkEgdHlwZXM6IGNvZGUsIGRldmljZSwgcXVlc3Rpb25zLCBzZWxlY3Rpb25zLiBFbWl0dGVkIGJ5OiBgU1VCTUlUX01GQWAgYW5kIGBUUkFOU0lUSU9OX1ZJRVdgIHdoZW4gYHZpZXdfbmFtZWAgaXMgYE1GQWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBtZmFfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmlldyB0aGF0IGlzIGJlaW5nIHRyYW5zaXRpb25lZCB0by4gRW1pdHRlZCBieTogYFRSQU5TSVRJT05fVklFV2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB2aWV3X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIHRoZSB2ZXJpZmljYXRpb24gbWV0aG9kIGZvciBhIG1hdGNoZWQgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIgb3IgdGhlIEF1dGggVHlwZSBTZWxlY3QgZmxvdyB0eXBlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBJZiBzZWxlY3Rpb24gaXMgdXNlZCB0byBkZXNjcmliZSBzZWxlY3RlZCB2ZXJpZmljYXRpb24gbWV0aG9kLCB0aGVuIHBvc3NpYmxlIHZhbHVlcyBhcmUgYHBob25lb3RwYCBvciBgcGFzc3dvcmRgOyAgaWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNlbGVjdGVkIEF1dGggVHlwZSBTZWxlY3QgZmxvdywgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBmbG93X3R5cGVfbWFudWFsYCBvciBgZmxvd190eXBlX2luc3RhbnRgLiBFbWl0dGVkIGJ5OiBgTUFUQ0hFRF9TRUxFQ1RfVkVSSUZZX01FVEhPRGAgYW5kIGBTRUxFQ1RfQVVUSF9UWVBFYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHNlbGVjdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgYnJhbmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBicmFuZF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gdGhpcyBpbnN0aXR1dGlvbiB3YXMgbWF0Y2hlZC4gVGhpcyB3aWxsIGJlIGVpdGhlciBgcmV0dXJuaW5nX3VzZXJgIG9yIGByb3V0aW5nX251bWJlcmAgaWYgZW1pdHRlZCBieSBgTUFUQ0hFRF9TRUxFQ1RfSU5TVElUVVRJT05gLiBPdGhlcndpc2UsIHRoaXMgd2lsbCBiZSBgU0FWRURfSU5TVElUVVRJT05gIG9yIGBBVVRPX1NFTEVDVF9TQVZFRF9JTlNUSVRVVElPTmAgaWYgZW1pdHRlZCBieSBgU0VMRUNUX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG1hdGNoX3JlYXNvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgc3VibWl0dGVkIGJ5IHVzZXIgYXQgdGhlIG1pY3JvLWRlcG9zaXRzIHJvdXRpbmcgbnVtYmVyIHBhbmUuIEVtaXR0ZWQgYnkgYFNVQk1JVF9ST1VUSU5HX05VTUJFUmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgbWFzayBleHRyYWN0ZWQgZnJvbSB0aGUgdXNlci1wcm92aWRlZCBhY2NvdW50IG51bWJlci4gSWYgdGhlIHVzZXItaW5wdXR0ZWQgYWNjb3VudCBudW1iZXIgaXMgZm91ciBkaWdpdHMgbG9uZywgYGFjY291bnRfbnVtYmVyX21hc2tgIGlzIGVtcHR5LiBFbWl0dGVkIGJ5IGBTVUJNSVRfQUNDT1VOVF9OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfbWFzaz86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBldmVudCB0aGF0IGhhcyBqdXN0IG9jY3VycmVkIGluIHRoZSBMaW5rIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRXZlbnROYW1lIHtcbiAgICBCYW5rSW5jb21lSW5zaWdodHNDb21wbGV0ZWQgPSAnQkFOS19JTkNPTUVfSU5TSUdIVFNfQ09NUExFVEVEJyxcbiAgICBDbG9zZU9hdXRoID0gJ0NMT1NFX09BVVRIJyxcbiAgICBFcnJvciA9ICdFUlJPUicsXG4gICAgRXhpdCA9ICdFWElUJyxcbiAgICBGYWlsT2F1dGggPSAnRkFJTF9PQVVUSCcsXG4gICAgSGFuZG9mZiA9ICdIQU5ET0ZGJyxcbiAgICBJc3N1ZUZvbGxvd2VkID0gJ0lTU1VFX0ZPTExPV0VEJyxcbiAgICBPcGVuID0gJ09QRU4nLFxuICAgIE9wZW5NeVBsYWlkID0gJ09QRU5fTVlfUExBSUQnLFxuICAgIE9wZW5PYXV0aCA9ICdPUEVOX09BVVRIJyxcbiAgICBTZWFyY2hJbnN0aXR1dGlvbiA9ICdTRUFSQ0hfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEF1dGhUeXBlID0gJ1NFTEVDVF9BVVRIX1RZUEUnLFxuICAgIFNlbGVjdEJyYW5kID0gJ1NFTEVDVF9CUkFORCcsXG4gICAgU2VsZWN0RGVncmFkZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfREVHUkFERURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdERvd25JbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRE9XTl9JTlNUSVRVVElPTicsXG4gICAgU2VsZWN0RmlsdGVyZWRJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfRklMVEVSRURfSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEluc3RpdHV0aW9uID0gJ1NFTEVDVF9JTlNUSVRVVElPTicsXG4gICAgU3VibWl0QWNjb3VudE51bWJlciA9ICdTVUJNSVRfQUNDT1VOVF9OVU1CRVInLFxuICAgIFN1Ym1pdENyZWRlbnRpYWxzID0gJ1NVQk1JVF9DUkVERU5USUFMUycsXG4gICAgU3VibWl0RG9jdW1lbnRzID0gJ1NVQk1JVF9ET0NVTUVOVFMnLFxuICAgIFN1Ym1pdERvY3VtZW50c0Vycm9yID0gJ1NVQk1JVF9ET0NVTUVOVFNfRVJST1InLFxuICAgIFN1Ym1pdERvY3VtZW50c1N1Y2Nlc3MgPSAnU1VCTUlUX0RPQ1VNRU5UU19TVUNDRVNTJyxcbiAgICBTdWJtaXRNZmEgPSAnU1VCTUlUX01GQScsXG4gICAgU3VibWl0Um91dGluZ051bWJlciA9ICdTVUJNSVRfUk9VVElOR19OVU1CRVInLFxuICAgIFRyYW5zaXRpb25WaWV3ID0gJ1RSQU5TSVRJT05fVklFVycsXG4gICAgVmlld0RhdGFUeXBlcyA9ICdWSUVXX0RBVEFfVFlQRVMnXG59XG5cbi8qKlxuICogVGhpcyB3ZWJob29rIGNvbnRhaW5zIGEgc3VtbWFyeSBvZiB0aGUgZXZlbnRzIGZyb20gYSBMaW5rIHNlc3Npb24gYW5kIHdpbGwgYmUgZmlyZWQgYWZ0ZXIgdGhlIHVzZXIgZmluaXNoZXMgZ29pbmcgdGhyb3VnaCBMaW5rLiBJZiB0aGUgdXNlciBhYmFuZG9ucyB0aGUgTGluayBmbG93IChpLmUuLCBjbG9zZXMgdGhlIGhvc3RlZCBsaW5rIHdlYnBhZ2Ugb3IgbGVhdmVzIExpbmsgb3BlbiBmb3IgdG9vIGxvbmcgd2l0aG91dCB0YWtpbmcgYW55IGFjdGlvbiksIHRoZSB3ZWJob29rIHdpbGwgYmUgZmlyZWQgNS0xNSBtaW51dGVzIGFmdGVyIHRoZSBsYXN0IHVzZXIgaW50ZXJhY3Rpb24uIEEgc2luZ2xlIExpbmsgc2Vzc2lvbiBtYXkgb2NjYXNpb25hbGx5IGdlbmVyYXRlIG11bHRpcGxlIGBFVkVOVFNgIHdlYmhvb2tzLiBJZiB0aGlzIG9jY3VycywgdGhlIG5ldyB3ZWJob29rIHdpbGwgY29udGFpbiBhbGwgcHJldmlvdXMgZXZlbnRzIGZvciB0aGUgc2Vzc2lvbiwgYXMgd2VsbCBhcyBuZXcgZXZlbnRzIHRoYXQgb2NjdXJyZWQgc2luY2UgdGhlIHByZXZpb3VzIGBFVkVOVFNgIHdlYmhvb2sgd2FzIHNlbnQuIElmIHRoaXMgb2NjdXJzLCBldmVudHMgY2FuIGJlIGdyb3VwZWQgdXNpbmcgdGhlIGBsaW5rX3Nlc3Npb25faWRgIGZpZWxkIGFuZCwgaWYgbmVjZXNzYXJ5LCBkZS1kdXBsaWNhdGVkIHVzaW5nIHRoZSBgZXZlbnRfaWRgIGZpZWxkLiAgQnkgZGVmYXVsdCwgdGhlIGBFVkVOVFNgIHdlYmhvb2sgaXMgc2VudCBvbmx5IGZvciBzZXNzaW9ucyB3aGVyZSB0aGUgZW5kIHVzZXIgZ29lcyB0aHJvdWdoIGEgSG9zdGVkIExpbmsgZmxvdyAoaW5jbHVkaW5nIExpbmsgUmVjb3ZlcnkgZmxvd3MpLiBJZiB5b3Ugd291bGQgbGlrZSB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3Igc2Vzc2lvbnMgbm90IHVzaW5nIEhvc3RlZCBMaW5rLCBjb250YWN0IHlvdXIgQWNjb3VudCBNYW5hZ2VyIG9yIFN1cHBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtFdmVudHNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50c1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSU5LYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVWRU5UU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBMaW5rIGV2ZW50cyBlbWl0dGVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtFdmVudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgZXZlbnRzOiBBcnJheTxMaW5rRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgZm9yIHRoZSBMaW5rIHNlc3Npb24gdGhlc2UgZXZlbnRzIG9jY3VycmVkIGluXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGluayB0b2tlbiB1c2VkIHRvIGNyZWF0ZSB0aGUgTGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBhcmUgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmsvb2F1dGgvY29ycmVsYXRpb25faWQvZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua19jb3JyZWxhdGlvbl9pZGAgZnJvbSBhIHJlY2VpdmVkIE9BdXRoIHJlZGlyZWN0IFVSSSBjYWxsYmFja1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2NvcnJlbGF0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGxpbmtfdG9rZW5gIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmUtaW5pdGlhbGl6ZSBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uQmFua0VtcGxveW1lbnRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzOiBDcmVkaXRTZXNzaW9uQmFua0VtcGxveW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzOiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRvY3VtZW50IHVwbG9hZCBDUkEgc2Vzc2lvbiBpbiBsaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0XG4gICAgICovXG4gICAgbnVtX2Jhbmtfc3RhdGVtZW50c191cGxvYWRlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIFBsYWlkIENoZWNrIEl0ZW0gYWRkIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIENoZWNrIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBUaGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYGFjY291bnRzYCB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25FeGl0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbmV4aXQpIGNhbGxiYWNrIGZyb20gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0XG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBbb25FeGl0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvd2ViLyNvbmV4aXQpIGNhbGxiYWNrIGZyb20gTGluay4gVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFtgZXhpdGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tZ2V0LXJlc3BvbnNlLWxpbmstc2Vzc2lvbnMtZXhpdCksIGZvciBpbXByb3ZlZCBuYW1pbmcgY29uc2lzdGVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Nlc3Npb25FeGl0TWV0YWRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBEaXNwbGF5ZWQgaWYgYSB1c2VyIGV4aXRzIExpbmsgd2l0aG91dCBzdWNjZXNzZnVsbHkgbGlua2luZyBhbiBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb2ludCBhdCB3aGljaCB0aGUgdXNlciBleGl0ZWQgdGhlIExpbmsgZmxvdy4gT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IElEIGZvciB0aGUgbGFzdCByZXF1ZXN0IG1hZGUgYnkgTGluay4gVGhpcyBjYW4gYmUgc2hhcmVkIHdpdGggUGxhaWQgU3VwcG9ydCB0byBleHBlZGl0ZSBpbnZlc3RpZ2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQW4gaW5zdGl0dXRpb24gb2JqZWN0LiBJZiB0aGUgSXRlbSB3YXMgY3JlYXRlZCB2aWEgU2FtZS1EYXkgb3IgSW5zdGFudCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiwgd2lsbCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBpbnN0aXR1dGlvbiBuYW1lLCBzdWNoIGFzIGBXZWxscyBGYXJnb2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgaW5zdGl0dXRpb24gaWRlbnRpZmllclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgY29tcGxldGVkIExpbmsgc2Vzc2lvbiwgYWxvbmcgd2l0aCB0aGUgcHVibGljIHRva2VuKHMpIGlmIGF2YWlsYWJsZS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2ViaG9vayBpcyBzZW50IG9ubHkgZm9yIHNlc3Npb25zIGVuYWJsZWQgZm9yIHRoZSBIb3N0ZWQgTGluayBmbG93IChpbmNsdWRpbmcgTGluayBSZWNvdmVyeSBmbG93cykgb3IgYSBNdWx0aS1JdGVtIExpbmsgZmxvdy4gSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIG90aGVyIHNlc3Npb25zLCBjb250YWN0IHlvdXIgQWNjb3VudCBNYW5hZ2VyIG9yIFN1cHBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSU5LYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNFU1NJT05fRklOSVNIRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmluYWwgc3RhdHVzIG9mIHRoZSBMaW5rIHNlc3Npb24uIFdpbGwgYWx3YXlzIGJlIFxcXCJTVUNDRVNTXFxcIiBvciBcXFwiRVhJVEVEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVibGljIHRva2VuIGdlbmVyYXRlZCBieSB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgYHB1YmxpY190b2tlbnNgIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVibGljIHRva2VucyBnZW5lcmF0ZWQgYnkgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGFuIEl0ZW0gYWRkIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgYXR0YWNoZWQgdG8gdGhlIGNvbm5lY3RlZCBJdGVtLiBJZiBBY2NvdW50IFNlbGVjdCBpcyBlbmFibGVkIHZpYSB0aGUgZGV2ZWxvcGVyIGRhc2hib2FyZCwgYGFjY291bnRzYCB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9wYXlzdHVic19yZXRyaWV2ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIFctMnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV93MnNfcmV0cmlldmVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNldCBvZiByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25SZXN1bHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25SZXN1bHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIEl0ZW0gYWRkcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgaXRlbV9hZGRfcmVzdWx0czogQXJyYXk8TGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIFBsYWlkIENoZWNrIEl0ZW0gYWRkcyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25DcmFJdGVtQWRkUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgY3JhX2l0ZW1fYWRkX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWVfcmVzdWx0czogQXJyYXk8TGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pbmNvbWVfcmVzdWx0czogQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgY3JhX2RvY3VtZW50X3VwbG9hZF9yZXN1bHRzPzogTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdCB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uU3VjY2Vzc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25zdWNjZXNzKSBjYWxsYmFjayBmcm9tIExpbmsuIFRoaXMgb2JqZWN0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIG5ld2VyIFtgcmVzdWx0cy5pdGVtX2FkZF9yZXN1bHRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWdldC1yZXNwb25zZS1saW5rLXNlc3Npb25zLXJlc3VsdHMtaXRlbS1hZGQtcmVzdWx0cyksIHdoaWNoIGNhbiBzdXBwb3J0IG11bHRpcGxlIHB1YmxpYyB0b2tlbnMgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIERpc3BsYXllZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc1xuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uPzogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdXNlclxcJ3MgYWN0aW9ucyBhbmQgZXZlbnRzIHRocm91Z2ggdGhlIExpbmsgZmxvdy4gSW5jbHVkZSB0aGlzIGlkZW50aWZpZXIgd2hlbiBvcGVuaW5nIGEgc3VwcG9ydCB0aWNrZXQgZm9yIGZhc3RlciB0dXJuYXJvdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIHRyYW5zZmVyX3N0YXR1cz86IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXMgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBhY2NvdW50IGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBhY2NvdW50IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMuIEl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKC9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgYW4gSXRlbVxcJ3MgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gb3IgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIHN0YXR1cy4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBjb2RlLiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgYG1hbnVhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIG1hbnVhbGx5IHZlcmlmaWVkICBgdmVyaWZpY2F0aW9uX2V4cGlyZWRgOiBQbGFpZCB3YXMgdW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgdmVyaWZ5IHRoZSBkZXBvc2l0IHdpdGhpbiA3IGNhbGVuZGFyIGRheXMgYW5kIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gdmFsaWRhdGUgdGhlIEl0ZW0uIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGB2ZXJpZmljYXRpb25fZmFpbGVkYDogVGhlIEl0ZW0gZmFpbGVkIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBiZWNhdXNlIHRoZSB1c2VyIGV4aGF1c3RlZCBhbGwgMyB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFVzZXJzIG1heSByZXRyeSBieSBzdWJtaXR0aW5nIHRoZWlyIGluZm9ybWF0aW9uIGFnYWluIHRocm91Z2ggTGluay4gIGBkYXRhYmFzZV9tYXRjaGVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMuICBgZGF0YWJhc2VfaW5zaWdodHNfcGVuZGluZ2A6IFRoZSBEYXRhYmFzZSBJbnNpZ2h0cyByZXN1bHQgaXMgcGVuZGluZyBhbmQgd2lsbCBiZSBhdmFpbGFibGUgdXBvbiBBdXRoIHJlcXVlc3QuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgbnVsbGA6IE5laXRoZXIgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gbm9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBhcmUgYmVpbmcgdXNlZCBmb3IgdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIHdhcyBiZWluZyB1c2VkLCBpbmRpY2F0ZXMgdGhlIHVzZXJcXCdzIHNlbGVjdGlvbiB3aGVuIGFza2VkIGlmIHRoZSBhY2NvdW50IGJlaW5nIHZlcmlmaWVkIGlzIGEgYGJ1c2luZXNzYCBvciBgcGVyc29uYWxgIGFjY291bnQuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBhcyBQbGFpZCBubyBsb25nZXIgY29sbGVjdHMgdGhpcyBpbmZvcm1hdGlvbiBkdXJpbmcgdGhlIG1pY3JvLWRlcG9zaXQgZmxvdy4gVG8gc2VlIHdoZXRoZXIgYW4gYWNjb3VudCBpcyBidXNpbmVzcyBvciBwZXJzb25hbCwgdXNlIHRoZSBgaG9sZGVyX2NhdGVnb3J5YCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2xhc3NfdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG9yIEluc3RhbnQgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgXFwnV2VsbHMgRmFyZ29cXCdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSB0cmFuc2Zlci4gUmV0dXJuZWQgb25seSB3aGVuIFtUcmFuc2ZlciBVSV0oL2RvY3MvdHJhbnNmZXIvdXNpbmctdHJhbnNmZXItdWkpIGlzIGltcGxlbWVudGVkLiAgLSBgQ09NUExFVEVgIOKAkyBUaGUgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZC4gLSBgSU5DT01QTEVURWAg4oCTIFRoZSB0cmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBGb3IgaGVscCwgc2VlIFtUcm91Ymxlc2hvb3RpbmcgdHJhbnNmZXJzXSgvZG9jcy90cmFuc2Zlci91c2luZy10cmFuc2Zlci11aSN0cm91Ymxlc2hvb3RpbmctdHJhbnNmZXJzKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhVHJhbnNmZXJTdGF0dXMge1xuICAgIENvbXBsZXRlID0gJ0NPTVBMRVRFJyxcbiAgICBJbmNvbXBsZXRlID0gJ0lOQ09NUExFVEUnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgcHJvdmlkZSBsaW1pdGVkIGFjY291bnQgZmlsdGVyaW5nOiBpdCB3aWxsIG9ubHkgZGlzcGxheSBJbnN0aXR1dGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCwgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSwgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWNjb3VudHMgb3RoZXIgdGhhbiBgY2hlY2tpbmdgLCBgc2F2aW5nc2AsIGFuZCBgY2FzaCBtYW5hZ2VtZW50YCBhY2NvdW50cyBvbiB0aGUgQWNjb3VudCBTZWxlY3QgcGFuZS4gWW91IGNhbiBmdXJ0aGVyIGxpbWl0IHRoZSBhY2NvdW50cyBzaG93biBpbiBMaW5rIGJ5IHVzaW5nIGBhY2NvdW50X2ZpbHRlcnNgIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgc3VidHlwZXMgdG8gYmUgc2hvd24gaW4gTGluay4gT25seSB0aGUgc3BlY2lmaWVkIHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIFRoaXMgZmlsdGVyaW5nIGFwcGxpZXMgdG8gYm90aCB0aGUgQWNjb3VudCBTZWxlY3QgdmlldyAoaWYgZW5hYmxlZCkgYW5kIHRoZSBJbnN0aXR1dGlvbiBTZWxlY3Qgdmlldy4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNlbGVjdGVkIHN1YnR5cGVzIHdpbGwgYmUgb21pdHRlZCBmcm9tIExpbmsuIFRvIGluZGljYXRlIHRoYXQgYWxsIHN1YnR5cGVzIHNob3VsZCBiZSBzaG93biwgdXNlIHRoZSB2YWx1ZSBgXFxcImFsbFxcXCJgLiBJZiB0aGUgYGFjY291bnRfZmlsdGVyc2AgZmlsdGVyIGlzIHVzZWQsIGFueSBhY2NvdW50IHR5cGUgZm9yIHdoaWNoIGEgZmlsdGVyIGlzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBlbnRpcmVseSBvbWl0dGVkIGZyb20gTGluay4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiAgVGhlIGZpbHRlciBtYXkgb3IgbWF5IG5vdCBpbXBhY3QgdGhlIGxpc3Qgb2YgYWNjb3VudHMgc2hvd24gYnkgdGhlIGluc3RpdHV0aW9uIGluIHRoZSBPQXV0aCBhY2NvdW50IHNlbGVjdGlvbiBmbG93LCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmljIGluc3RpdHV0aW9uLiBJZiB0aGUgdXNlciBzZWxlY3RzIGV4Y2x1ZGVkIGFjY291bnQgc3VidHlwZXMgaW4gdGhlIE9BdXRoIGZsb3csIHRoZXNlIGFjY291bnRzIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBJdGVtLiBJZiB0aGUgdXNlciBzZWxlY3RzIG9ubHkgZXhjbHVkZWQgYWNjb3VudCBzdWJ0eXBlcywgdGhlIGxpbmsgYXR0ZW1wdCB3aWxsIGZhaWwgYW5kIHRoZSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8gdHJ5IGFnYWluLiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5BY2NvdW50RmlsdGVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IERlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBDcmVkaXRGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5GaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEludmVzdG1lbnRGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge090aGVyRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIG90aGVyPzogT3RoZXJGaWx0ZXI7XG59XG4vKipcbiAqIEEgbWFwIGNvbnRhaW5pbmcgZGF0YSB0byBwYXNzIGluIGZvciB0aGUgQ2FyZCBTd2l0Y2ggZmxvdy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2gge1xuICAgIC8qKlxuICAgICAqIFRoZSBCSU4gKEJhbmsgSWRlbnRpZmljYXRpb24gTnVtYmVyKSBvZiB0aGUgY2FyZCB0byBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaFxuICAgICAqL1xuICAgIGNhcmRfYmluOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBIb3N0ZWQgTGluay4gVG8gZW5hYmxlIHRoZSBzZXNzaW9uIGZvciBIb3N0ZWQgTGluaywgc2VuZCB0aGlzIG9iamVjdCBpbiB0aGUgcmVxdWVzdC4gSXQgY2FuIGJlIGVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGluayB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hvc3RlZExpbmtEZWxpdmVyeU1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGRlbGl2ZXJ5X21ldGhvZD86IEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZDtcbiAgICAvKipcbiAgICAgKiBVUkkgdGhhdCBIb3N0ZWQgTGluayB3aWxsIHJlZGlyZWN0IHRvIHVwb24gY29tcGxldGlvbiBvZiB0aGUgTGluayBmbG93LiBUaGlzIHdpbGwgb25seSBvY2N1ciBpbiBIb3N0ZWQgTGluayBzZXNzaW9ucywgbm90IGluIG90aGVyIGltcGxlbWVudGF0aW9uIG1ldGhvZHMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICBjb21wbGV0aW9uX3JlZGlyZWN0X3VyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBzZWNvbmRzIHRoZSBsaW5rIHdpbGwgYmUgdmFsaWQgZm9yLiBNdXN0IGJlIHBvc2l0aXZlLiBDYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMjEgZGF5cy4gVGhlIGRlZmF1bHQgbGlmZXRpbWUgaXMgNyBkYXlzIGZvciBsaW5rcyBkZWxpdmVyZWQgYnkgZW1haWwsIDEgZGF5IGZvciBsaW5rcyBkZWxpdmVyZWQgdmlhIFNNUywgYW5kIDMwIG1pbnV0ZXMgZm9yIGxpbmtzIG5vdCBzZW50IHZpYSBQbGFpZCBMaW5rIGRlbGl2ZXJ5LiBUaGlzIHBhcmFtZXRlciB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBvZiBhbGwgdGhyZWUgbGluayB0eXBlcy4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIHVybF9saWZldGltZV9zZWNvbmRzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNsaWVudCBpcyBvcGVuaW5nIGhvc3RlZCBMaW5rIGluIGEgbW9iaWxlIGFwcCBpbiBhbiBvdXQgb2YgcHJvY2VzcyB3ZWIgdmlldyAoT09QV1YpIChpLmUuLCBhbiBgQXNXZWJBdXRoZW50aWNhdGlvblNlc3Npb25gIC8gYFNGU2FmYXJpVmlld0NvbnRyb2xsZXJgIG9yIEFuZHJvaWQgQ3VzdG9tIFRhYikuIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgaXNfbW9iaWxlX2FwcD86IGJvb2xlYW47XG59XG4vKipcbiAqIElkZW50aXR5IG9iamVjdCB1c2VkIHRvIHNwZWNpZnkgZG9jdW1lbnQgdXBsb2FkXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgaXNfZG9jdW1lbnRfdXBsb2FkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgLiBDdXJyZW50bHkgY2FuIG9ubHkgY29udGFpbiBvbmUgYGFjY291bnRfaWRgLiBNdXN0IGJlIHBvcHVsYXRlZCBpZiB1c2luZyBEb2N1bWVudCBVcGxvYWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBhcnNpbmcgY29uZmlndXJhdGlvbnMuIFZhbGlkIHBhcnNpbmcgY29uZmlndXJhdGlvbnMgYXJlIGBvY3JgIGFuZCBgcmlza19zaWduYWxzYC4gSWYgcGFyc2luZyBjb25maWd1cmF0aW9ucyBhcmUgb21pdHRlZCwgZGVmYXVsdHMgdG8gYG9jcmBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWdzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz47XG59XG4vKipcbiAqIEEgbWFwIGNvbnRhaW5pbmcgZGF0YSB1c2VkIHRvIGhpZ2hsaWdodCBpbnN0aXR1dGlvbnMgaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGJhbmsgdG8gaGlnaGxpZ2h0IGluIExpbmsuIE5vdGU6IGluIHJhcmUgY2FzZXMsIGEgc2luZ2xlIHJvdXRpbmcgbnVtYmVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgaW5zdGl0dXRpb25zLCBlLmcuIGR1ZSB0byBhIGJyb2tlcmFnZSB1c2luZyBhbm90aGVyIGluc3RpdHV0aW9uIHRvIG1hbmFnZSBBQ0ggb24gaXRzIHN3ZWVwIGFjY291bnRzLiBJZiB0aGlzIGhhcHBlbnMsIHRoZSBiYW5rIHdpbGwgbm90IGJlIGhpZ2hsaWdodGVkIGluIExpbmsgZXZlbiBpZiB0aGUgcm91dGluZyBudW1iZXIgaXMgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllcikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM/OiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB5b3VyIGFwcGxpY2F0aW9uLCBhcyBpdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIExpbmsuIE1heGltdW0gbGVuZ3RoIG9mIDMwIGNoYXJhY3RlcnMuIElmIGEgdmFsdWUgbG9uZ2VyIHRoYW4gMzAgY2hhcmFjdGVycyBpcyBwcm92aWRlZCwgTGluayB3aWxsIGRpc3BsYXkgXFxcIlRoaXMgQXBwbGljYXRpb25cXFwiIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhbmd1YWdlIHRoYXQgTGluayBzaG91bGQgYmUgZGlzcGxheWVkIGluLiBXaGVuIGluaXRpYWxpemluZyB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgdGhpcyBmaWVsZCBpcyBub3QgdXNlZDsgZm9yIG1vcmUgZGV0YWlscywgc2VlIFtJZGVudGl0eSBWZXJpZmljYXRpb24gc3VwcG9ydGVkIGxhbmd1YWdlc10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uLyNzdXBwb3J0ZWQtbGFuZ3VhZ2VzKS4gIFN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOiAtIERhbmlzaCAoYFxcJ2RhXFwnYCkgLSBEdXRjaCAoYFxcJ25sXFwnYCkgLSBFbmdsaXNoIChgXFwnZW5cXCdgKSAtIEVzdG9uaWFuIChgXFwnZXRcXCdgKSAtIEZyZW5jaCAoYFxcJ2ZyXFwnYCkgLSBHZXJtYW4gKGBcXCdkZVxcJ2ApIC0gSGluZGkgKGBcXCdoaVxcJ2ApIC0gSXRhbGlhbiAoYFxcJ2l0XFwnYCkgLSBMYXR2aWFuIChgXFwnbHZcXCdgKSAtIExpdGh1YW5pYW4gKGBcXCdsdFxcJ2ApIC0gTm9yd2VnaWFuIChgXFwnbm9cXCdgKSAtIFBvbGlzaCAoYFxcJ3BsXFwnYCkgLSBQb3J0dWd1ZXNlIChgXFwncHRcXCdgKSAtIFJvbWFuaWFuIChgXFwncm9cXCdgKSAtIFNwYW5pc2ggKGBcXCdlc1xcJ2ApIC0gU3dlZGlzaCAoYFxcJ3N2XFwnYCkgLSBWaWV0bmFtZXNlIChgXFwndmlcXCdgKSAgV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyZWQgaGVyZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5nIGluIHRoZSBjdXN0b21pemF0aW9uLCBvciB0aGUgY3VzdG9taXphdGlvbiB3aWxsIG5vdCBiZSBhcHBsaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2YgUGxhaWQtc3VwcG9ydGVkIGNvdW50cnkgY29kZXMgdXNpbmcgdGhlIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuIEluc3RpdHV0aW9ucyBmcm9tIGFsbCBsaXN0ZWQgY291bnRyaWVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGNvbXBsZXRlIG1hcHBpbmcgb2Ygc3VwcG9ydGVkIHByb2R1Y3RzIGJ5IGNvdW50cnksIHNlZSBodHRwczovL3BsYWlkLmNvbS9nbG9iYWwvLiAgSWYgdXNpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCBgY291bnRyeV9jb2Rlc2Agc2hvdWxkIGJlIHNldCB0byB0aGUgY291bnRyeSB3aGVyZSB5b3VyIGNvbXBhbnkgaXMgYmFzZWQsIG5vdCB0aGUgY291bnRyeSB3aGVyZSB5b3VyIHVzZXIgaXMgbG9jYXRlZC4gRm9yIGFsbCBvdGhlciBwcm9kdWN0cywgYGNvdW50cnlfY29kZXNgIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHlvdXIgdXNlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgSWYgTGluayBpcyBsYXVuY2hlZCB3aXRoIG11bHRpcGxlIGNvdW50cnkgY29kZXMsIG9ubHkgcHJvZHVjdHMgdGhhdCB5b3UgYXJlIGVuYWJsZWQgZm9yIGluIGFsbCBjb3VudHJpZXMgd2lsbCBiZSB1c2VkIGJ5IExpbmsuIE5vdGUgdGhhdCB3aGlsZSBhbGwgY291bnRyaWVzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaW4gU2FuZGJveCwgaW4gUHJvZHVjdGlvbiBvbmx5IFVTIGFuZCBDYW5hZGEgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gRXVyb3BlYW4gaW5zdGl0dXRpb25zLCBbZmlsZSBhIHByb2R1Y3QgYWNjZXNzIFN1cHBvcnQgdGlja2V0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vc3VwcG9ydC9uZXcvcHJvZHVjdC1hbmQtZGV2ZWxvcG1lbnQvcHJvZHVjdC10cm91Ymxlc2hvb3RpbmcvcmVxdWVzdC1wcm9kdWN0LWFjY2VzcykgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuICBJZiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgbWFrZSBzdXJlIHRoZSBjb3VudHJ5IGNvZGVzIGluIHRoZSBjdXN0b21pemF0aW9uIG1hdGNoIHRob3NlIHNwZWNpZmllZCBpbiBgY291bnRyeV9jb2Rlc2AsIG9yIHRoZSBjdXN0b21pemF0aW9uIG1heSBub3QgYmUgYXBwbGllZC4gIElmIHVzaW5nIHRoZSBBdXRoIGZlYXR1cmVzIEluc3RhbnQgTWF0Y2gsIEluc3RhbnQgTWljcm8tZGVwb3NpdHMsIFNhbWUtZGF5IE1pY3JvLWRlcG9zaXRzLCBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMsIG9yIERhdGFiYXNlIEluc2lnaHRzLCBgY291bnRyeV9jb2Rlc2AgbXVzdCBiZSBzZXQgdG8gYFtcXCdVU1xcJ11gLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXI7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZS4gSWYgbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHNob3VsZCBiZSBvbWl0dGVkICh1bmxlc3MgeW91IGFyZSB1c2luZyB1cGRhdGUgbW9kZSB0byBhZGQgSW5jb21lIG9yIEFzc2V0cyB0byBhbiBJdGVtKTsgcmVxdWlyZWQgb3RoZXJ3aXNlLiAgYGJhbGFuY2VgIGlzICpub3QqIGEgdmFsaWQgdmFsdWUsIHRoZSBCYWxhbmNlIHByb2R1Y3QgZG9lcyBub3QgcmVxdWlyZSBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaXRpYWxpemVkIHdoZW4gYW55IG90aGVyIHByb2R1Y3QgaXMgaW5pdGlhbGl6ZWQuICBUaGUgcHJvZHVjdHMgc3BlY2lmaWVkIGhlcmUgd2lsbCBkZXRlcm1pbmUgd2hpY2ggaW5zdGl0dXRpb25zIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHlvdXIgdXNlcnMgaW4gTGluay4gT25seSBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0ICphbGwqIHJlcXVlc3RlZCBwcm9kdWN0cyBjYW4gYmUgc2VsZWN0ZWQ7IGEgaWYgYSB1c2VyIGF0dGVtcHRzIHRvIHNlbGVjdCBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgYSBsaXN0ZWQgcHJvZHVjdCwgYSBcXFwiQ29ubmVjdGl2aXR5IG5vdCBzdXBwb3J0ZWRcXFwiIGVycm9yIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gTGluay4gVG8gbWF4aW1pemUgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgYXZhaWxhYmxlLCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgbWluaW1hbCBwcm9kdWN0IHNldCByZXF1aXJlZCBmb3IgeW91ciB1c2UgY2FzZS4gICBBZGRpdGlvbmFsIHByb2R1Y3RzIGNhbiBiZSBpbmNsdWRlZCB2aWEgdGhlIFtgb3B0aW9uYWxfcHJvZHVjdHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LW9wdGlvbmFsLXByb2R1Y3RzKSBvciAgW2ByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXJlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykgZmllbGRzLiBQcm9kdWN0cyBjYW4gYWxzbyBiZSBpbml0aWFsaXplZCBieSBjYWxsaW5nIHRoZSBlbmRwb2ludCBhZnRlciBvYnRhaW5pbmcgYW4gYWNjZXNzIHRva2VuOyB0aGlzIG1heSByZXF1aXJlIHRoZSBwcm9kdWN0IHRvIGJlIGxpc3RlZCBpbiB0aGUgW2BhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtYWRkaXRpb25hbC1jb25zZW50ZWQtcHJvZHVjdHMpIGFycmF5LiBGb3IgZGV0YWlscywgc2VlIFtDaG9vc2luZyB3aGVuIHRvIGluaXRpYWxpemUgcHJvZHVjdHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvKS4gIE5vdGUgdGhhdCwgdW5sZXNzIHlvdSBoYXZlIG9wdGVkIHRvIGRpc2FibGUgSW5zdGFudCBNYXRjaCBzdXBwb3J0LCBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IEluc3RhbnQgTWF0Y2ggd2lsbCBhbHNvIGJlIHNob3duIGluIExpbmsgaWYgYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGV2ZW4gdGhvdWdoIHRoZXNlIGluc3RpdHV0aW9ucyBkbyBub3QgY29udGFpbiBgYXV0aGAgaW4gdGhlaXIgcHJvZHVjdCBhcnJheS4gIEluIFByb2R1Y3Rpb24sIHlvdSB3aWxsIGJlIGJpbGxlZCBmb3IgZWFjaCBwcm9kdWN0IHRoYXQgeW91IHNwZWNpZnkgd2hlbiBpbml0aWFsaXppbmcgTGluay4gTm90ZSB0aGF0IGEgcHJvZHVjdCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIGFuIEl0ZW0gb25jZSB0aGUgSXRlbSBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoYXQgcHJvZHVjdC4gVG8gc3RvcCBiaWxsaW5nIG9uIGFuIEl0ZW0gZm9yIHN1YnNjcmlwdGlvbi1iYXNlZCBwcm9kdWN0cywgc3VjaCBhcyBMaWFiaWxpdGllcywgSW52ZXN0bWVudHMsIGFuZCBUcmFuc2FjdGlvbnMsIHJlbW92ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gdXNlIG9ubHkgaWYgdGhlIGluc3RpdHV0aW9uIGFuZCBhY2NvdW50KHMpIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIHN1cHBvcnQgdGhlIHByb2R1Y3QuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gVGhlIHByb2R1Y3RzIHdpbGwgb25seSBiZSBleHRyYWN0ZWQgYW5kIGJpbGxlZCBpZiB0aGUgdXNlciBzZWxlY3RzIGFuIGluc3RpdHV0aW9uIGFuZCBhY2NvdW50IHR5cGUgdGhhdCBzdXBwb3J0cyB0aGVtLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW1JlcXVpcmVkIGlmIFN1cHBvcnRlZCBQcm9kdWN0c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9pbml0aWFsaXppbmctcHJvZHVjdHMvI3JlcXVpcmVkLWlmLXN1cHBvcnRlZC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHRoYXQgd2lsbCBlbmhhbmNlIHRoZSBjb25zdW1lclxcJ3MgdXNlIGNhc2UsIGJ1dCB0aGF0IHlvdXIgYXBwIGNhbiBmdW5jdGlvbiB3aXRob3V0LiBQbGFpZCB3aWxsIGF0dGVtcHQgdG8gZmV0Y2ggZGF0YSBmb3IgdGhlc2UgcHJvZHVjdHMgb24gYSBiZXN0LWVmZm9ydCBiYXNpcywgYW5kIGZhaWx1cmUgdG8gc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIG5vdCBhZmZlY3QgSXRlbSBjcmVhdGlvbi4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5cy4gVGhlIGBwcm9kdWN0c2AgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiAgRm9yIG1vcmUgZGV0YWlscyBvbiB1c2luZyB0aGlzIGZlYXR1cmUsIHNlZSBbT3B0aW9uYWwgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNvcHRpb25hbC1wcm9kdWN0cykuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbmFsX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFkZGl0aW9uYWwgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byBjb2xsZWN0IGNvbnNlbnQgZm9yIHRvIHN1cHBvcnQgeW91ciB1c2UgY2FzZS4gVGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYmUgYmlsbGVkIHVudGlsIHlvdSBzdGFydCB1c2luZyB0aGVtIGJ5IGNhbGxpbmcgdGhlIHJlbGV2YW50IGVuZHBvaW50cy4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBoYXZlIGNvbnNlbnQgY29sbGVjdGVkLiAgSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiBMaW5rLiAgVGhlcmUgc2hvdWxkIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aGlzIGFycmF5IGFuZCB0aGUgYHByb2R1Y3RzYCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheXMuICBJZiB5b3UgaW5jbHVkZSBgc2lnbmFsYCBpbiBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgLCB5b3Ugd2lsbCBuZWVkIHRvIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgYmVmb3JlIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhbiBJdGVtIGluIG9yZGVyIHRvIGdldCB0aGUgbW9zdCBhY2N1cmF0ZSByZXN1bHRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1VzaW5nIGAvc2lnbmFsL3ByZXBhcmVgXSgvZG9jcy9zaWduYWwvI3VzaW5nLXNpZ25hbHByZXBhcmUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIFVSTCB0byB3aGljaCBhbnkgd2ViaG9va3Mgc2hvdWxkIGJlIHNlbnQuIE5vdGUgdGhhdCB3ZWJob29rcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIChlLXdhbGxldCB0cmFuc2FjdGlvbnMgb25seSksIFRyYW5zZmVyLCBCYW5rIFRyYW5zZmVyIChpbmNsdWRpbmcgQXV0aCBtaWNyby1kZXBvc2l0IG5vdGlmaWNhdGlvbiB3ZWJob29rcyksIE1vbml0b3IsIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgYW5kIExpbmsgRXZlbnRzIGFyZSBjb25maWd1cmVkIHZpYSB0aGUgRGFzaGJvYXJkIGluc3RlYWQuIEluIHVwZGF0ZSBtb2RlLCB0aGlzIGZpZWxkIHdpbGwgbm90IGhhdmUgYW4gZWZmZWN0OyB0byB1cGRhdGUgdGhlIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIGFuIGV4aXN0aW5nIEl0ZW0sIHVzZSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSB0byB1cGRhdGUgb3IgcmVmZXJlbmNlLCB1c2VkIHdoZW4gdXBkYXRpbmcsIG1vZGlmeWluZywgb3IgYWNjZXNzaW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gLiBVc2VkIHdoZW4gbGF1bmNoaW5nIExpbmsgaW4gdXBkYXRlIG1vZGUsIHdoZW4gY29tcGxldGluZyB0aGUgU2FtZS1kYXkgKG1hbnVhbCkgTWljcm8tZGVwb3NpdCBmbG93LCBvciAob3B0aW9uYWxseSkgd2hlbiBpbml0aWFsaXppbmcgTGluayBmb3IgYSByZXR1cm5pbmcgdXNlciBhcyBwYXJ0IG9mIHRoZSBUcmFuc2ZlciBVSSBmbG93LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2Nlc3MgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaXRlbXMgdG8gdXBkYXRlIGluIExpbmsgdXBkYXRlIG1vZGUgZm9yIHRoZSBBc3NldHMgcHJvZHVjdC4gVXNpbmcgdGhpcyBpbnN0ZWFkIG9mIHRoZSBgYWNjZXNzX3Rva2VuYCBmaWVsZCBhbGxvd3MgdGhlIHVwZGF0aW5nIG9mIG11bHRpcGxlIGl0ZW1zIGF0IG9uY2UuIFRoaXMgZmVhdHVyZSBpcyBpbiBjbG9zZWQgYmV0YSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mby5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMaW5rIGN1c3RvbWl6YXRpb24gZnJvbSB0aGUgUGxhaWQgRGFzaGJvYXJkIHRvIGJlIGFwcGxpZWQgdG8gTGluay4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGBkZWZhdWx0YCBjdXN0b21pemF0aW9uIHdpbGwgYmUgdXNlZC4gV2hlbiB1c2luZyBhIExpbmsgY3VzdG9taXphdGlvbiwgdGhlIGxhbmd1YWdlIGluIHRoZSBjdXN0b21pemF0aW9uIG11c3QgbWF0Y2ggdGhlIGxhbmd1YWdlIHNlbGVjdGVkIHZpYSB0aGUgYGxhbmd1YWdlYCBwYXJhbWV0ZXIsIGFuZCB0aGUgY291bnRyaWVzIGluIHRoZSBjdXN0b21pemF0aW9uIHNob3VsZCBtYXRjaCB0aGUgY291bnRyeSBjb2RlcyBzZWxlY3RlZCB2aWEgYGNvdW50cnlfY29kZXNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2N1c3RvbWl6YXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSSSBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSBhIHVzZXIgc2hvdWxkIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBUaGUgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIG5vdCBjb250YWluIGFueSBxdWVyeSBwYXJhbWV0ZXJzLiBXaGVuIHVzZWQgaW4gUHJvZHVjdGlvbiwgbXVzdCBiZSBhbiBodHRwcyBVUkkuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gTm90ZSB0aGF0IGFueSByZWRpcmVjdCBVUkkgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgbGlzdCBpbiB0aGUgW2RldmVsb3BlciBkYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkuIElmIGluaXRpYWxpemluZyBvbiBBbmRyb2lkLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgc3BlY2lmaWVkIGluc3RlYWQgYW5kIGByZWRpcmVjdF91cmlgIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBcXCdzIEFuZHJvaWQgcGFja2FnZS4gUmVxdWlyZWQgaWYgdXNpbmcgdGhlIGBsaW5rX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgb24gQW5kcm9pZC4gQW55IHBhY2thZ2UgbmFtZSBzcGVjaWZpZWQgaGVyZSBtdXN0IGFsc28gYmUgYWRkZWQgdG8gdGhlIEFsbG93ZWQgQW5kcm9pZCBwYWNrYWdlIG5hbWVzIHNldHRpbmcgb24gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBXaGVuIGNyZWF0aW5nIGEgYGxpbmtfdG9rZW5gIGZvciBpbml0aWFsaXppbmcgTGluayBvbiBvdGhlciBwbGF0Zm9ybXMsIGBhbmRyb2lkX3BhY2thZ2VfbmFtZWAgbXVzdCBiZSBsZWZ0IGJsYW5rIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbmRyb2lkX3BhY2thZ2VfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhcmRfc3dpdGNoPzogTGlua1Rva2VuQ3JlYXRlQ2FyZFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQWNjb3VudEZpbHRlcnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBMaW5rVG9rZW5BY2NvdW50RmlsdGVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuRVVDb25maWd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldV9jb25maWc/OiBMaW5rVG9rZW5FVUNvbmZpZztcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBjZXJ0YWluIEV1cm9wZS1vbmx5IGNvbmZpZ3VyYXRpb25zLCBhcyB3ZWxsIGFzIGNlcnRhaW4gbGVnYWN5IHVzZSBjYXNlcyBpbiBvdGhlciByZWdpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9jb25maWd1cmF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveW1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhc2VfcmVwb3J0PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVkaXRfcGFydG5lcl9pbnNpZ2h0cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JhX29wdGlvbnM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2UgJiBzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZT86IENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlICYgc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGg/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXI/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1cGRhdGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb24/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzO1xuICAgIC8qKlxuICAgICAqIEEgdXNlciB0b2tlbiBnZW5lcmF0ZWQgdXNpbmcgYC91c2VyL2NyZWF0ZWAuIEFueSBJdGVtIGNyZWF0ZWQgZHVyaW5nIHRoZSBMaW5rIHNlc3Npb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBMaW5rVG9rZW5JbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuSW52ZXN0bWVudHNBdXRofVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfYXV0aD86IExpbmtUb2tlbkludmVzdG1lbnRzQXV0aDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGhvc3RlZF9saW5rPzogTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGluaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogTGlua1Rva2VuVHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgcmVxdWVzdCBhIENSQSBjb25uZWN0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JhX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5PzogTGlua1Rva2VuQ3JlYXRlSWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBpbmRpY2F0ZXMgdGhhdCBjbGllbnQgc3VwcG9ydHMgbGlua2luZyBGaW5hbmNlS2l0IC8gQXBwbGVDYXJkIGl0ZW1zLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmluYW5jZWtpdF9zdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgZW5hYmxlIGxpbmtpbmcgbXVsdGlwbGUgaXRlbXMgaW4gdGhlIHNhbWUgTGluayBzZXNzaW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5hYmxlX211bHRpX2l0ZW1fbGluaz86IGJvb2xlYW47XG59XG4vKipcbiAqIEJ5IGRlZmF1bHQsIExpbmsgd2lsbCBvbmx5IGRpc3BsYXkgYWNjb3VudCB0eXBlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYWxsIHByb2R1Y3RzIHN1cHBsaWVkIGluIHRoZSBgcHJvZHVjdHNgIHBhcmFtZXRlciBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gWW91IGNhbiBmdXJ0aGVyIGxpbWl0IHRoZSBhY2NvdW50cyBzaG93biBpbiBMaW5rIGJ5IHVzaW5nIGBhY2NvdW50X2ZpbHRlcnNgIHRvIHNwZWNpZnkgdGhlIGFjY291bnQgc3VidHlwZXMgdG8gYmUgc2hvd24gaW4gTGluay4gT25seSB0aGUgc3BlY2lmaWVkIHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIFRoaXMgZmlsdGVyaW5nIGFwcGxpZXMgdG8gYm90aCB0aGUgQWNjb3VudCBTZWxlY3QgdmlldyAoaWYgZW5hYmxlZCkgYW5kIHRoZSBJbnN0aXR1dGlvbiBTZWxlY3Qgdmlldy4gSW5zdGl0dXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNlbGVjdGVkIHN1YnR5cGVzIHdpbGwgYmUgb21pdHRlZCBmcm9tIExpbmsuIFRvIGluZGljYXRlIHRoYXQgYWxsIHN1YnR5cGVzIHNob3VsZCBiZSBzaG93biwgdXNlIHRoZSB2YWx1ZSBgXFxcImFsbFxcXCJgLiBJZiB0aGUgYGFjY291bnRfZmlsdGVyc2AgZmlsdGVyIGlzIHVzZWQsIGFueSBhY2NvdW50IHR5cGUgZm9yIHdoaWNoIGEgZmlsdGVyIGlzIG5vdCBzcGVjaWZpZWQgd2lsbCBiZSBlbnRpcmVseSBvbWl0dGVkIGZyb20gTGluay4gIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIEZvciBpbnN0aXR1dGlvbnMgdXNpbmcgT0F1dGgsIHRoZSBmaWx0ZXIgd2lsbCBub3QgYWZmZWN0IHRoZSBsaXN0IG9mIGluc3RpdHV0aW9ucyBvciBhY2NvdW50cyBzaG93biBieSB0aGUgYmFuayBpbiB0aGUgT0F1dGggd2luZG93LiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgZGVwb3NpdG9yeT86IExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGNyZWRpdD86IExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGxvYW4/OiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEF1dGggcHJvZHVjdC4gVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBlbmFibGUgb3IgZGlzYWJsZSBleHRlbmRlZCBBdXRoIGZsb3dzIGZvciB0aGUgcmVzdWx0aW5nIExpbmsgc2Vzc2lvbi4gT21pdHRpbmcgYW55IGZpZWxkIHdpbGwgcmVzdWx0IGluIGEgZGVmYXVsdCB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGJ5IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdGhhdCB3aWxsIGFwcGx5IGlmIHlvdSBoYXZlIG5vdCByZXF1ZXN0ZWQgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gYXBwbHkgYSBkaWZmZXJlbnQgZGVmYXVsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aCB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgQXV0aCBUeXBlIFNlbGVjdCBpcyBlbmFibGVkIGZvciB0aGUgTGluayBzZXNzaW9uLCBhbGxvd2luZyB0aGUgZW5kIHVzZXIgdG8gY2hvb3NlIGJldHdlZW4gbGlua2luZyB2aWEgYSBjcmVkZW50aWFscy1iYXNlZCBmbG93IChpLmUuIEluc3RhbnQgQXV0aCwgSW5zdGFudCBNYXRjaCwgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzKSBvciBhIG1hbnVhbCBmbG93IHRoYXQgZG9lcyBub3QgcmVxdWlyZSBsb2dpbiAoYWxsIG90aGVyIEF1dGggZmxvd3MpIHByaW9yIHRvIHNlbGVjdGluZyB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBhdXRoX3R5cGVfc2VsZWN0X2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBmbG93LiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0b21hdGVkX21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgSW5zdGFudCBNYXRjaCBmbG93LiBJbnN0YW50IE1hdGNoIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gSW5zdGFudCBNYXRjaCBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGlzIGZpZWxkIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgaW5zdGFudF9tYXRjaF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93LiAgRGVmYXVsdCBiZWhhdmlvciBpcyBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHNhbWVfZGF5X21pY3JvZGVwb3NpdHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgSW5zdGFudCBNaWNyby1kZXBvc2l0cyBmbG93LiAgRGVmYXVsdCBiZWhhdmlvciBmb3IgUGxhaWQgdGVhbXMgY3JlYXRlZCBhZnRlciBOb3ZlbWJlciAyMDIzIGlzIGBmYWxzZWA7IGRlZmF1bHQgYmVoYXZpb3IgZm9yIFBsYWlkIHRlYW1zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZGF0ZSBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgaW5zdGFudF9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGF0IHR5cGUgb2YgW1Jlcm91dGUgdG8gQ3JlZGVudGlhbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9zYW1lLWRheS8jcmVyb3V0ZS10by1jcmVkZW50aWFscykgcGFuZSBzaG91bGQgYmUgdXNlZCBpbiB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gRGVmYXVsdCBiZWhhdmlvciBpcyBgT1BUSU9OQUxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgcmVyb3V0ZV90b19jcmVkZW50aWFscz86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIERhdGFiYXNlIE1hdGNoIGZsb3cuIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBkYXRhYmFzZV9tYXRjaF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBEYXRhYmFzZSBJbnNpZ2h0cyBmbG93LiBEYXRhYmFzZSBJbnNpZ2h0cyBpcyBjdXJyZW50bHkgaW4gY2xvc2VkIGJldGE7IGZvciBhY2Nlc3MsIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBkYXRhYmFzZV9pbnNpZ2h0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYGF1dGhfdHlwZV9zZWxlY3RfZW5hYmxlZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZsb3dfdHlwZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgU01TIG1pY3JvLWRlcG9zaXRzIHZlcmlmaWNhdGlvbi4gRGVmYXVsdCBiZWhhdmlvciBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgc21zX21pY3JvZGVwb3NpdHNfdmVyaWZpY2F0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoUmVyb3V0ZVRvQ3JlZGVudGlhbHNFbnVtIHtcbiAgICBPZmYgPSAnT0ZGJyxcbiAgICBPcHRpb25hbCA9ICdPUFRJT05BTCcsXG4gICAgRm9yY2VkID0gJ0ZPUkNFRCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhGbG93VHlwZUVudW0ge1xuICAgIEZsZXhpYmxlQXV0aCA9ICdGTEVYSUJMRV9BVVRIJ1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGFzc2V0c2AgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIHRoZSBjbGllbnQgaXMgQ1JBLWVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBpbmNsdWRlIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0XG4gICAgICovXG4gICAgY2xpZW50X3JlcG9ydF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGxhaWQgQ2hlY2sgcHJvZHVjdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiBQbGFpZCBDaGVjayBwcm9kdWN0cy4gRGVmYXVsdCB2YWx1ZSBpcyAzNjU7IG1heGltdW0gaXMgNzMwOyBtaW5pbXVtIGlzIDE4MC4gSWYgYSB2YWx1ZSBsb3dlciB0aGFuIDE4MCBpcyBwcm92aWRlZCwgYSBtaW5pbXVtIG9mIDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWlyZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIHBhcnRuZXJfaW5zaWdodHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGJhc2VfcmVwb3J0PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Nhc2hmbG93SW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgY2FzaGZsb3dfaW5zaWdodHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Nhc2hmbG93SW5zaWdodHM7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEJhc2UgUmVwb3J0IHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Nhc2hmbG93SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Nhc2hmbG93SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBQbGFpZCBDaGVjayBzY29yZSB0byByZXR1cm5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Nhc2hmbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBwbGFpZF9jaGVja19zY29yZV92ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgYXR0cmlidXRlc192ZXJzaW9uPzogQ2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENyZWRpdCBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWZpYyBQcmlzbSBwcm9kdWN0cyB0byByZXR1cm4uIElmIG5vbmUgYXJlIHBhc3NlZCBpbiwgdGhlbiBhbGwgcHJvZHVjdHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJpc21Qcm9kdWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmlzbV9wcm9kdWN0cz86IEFycmF5PFByaXNtUHJvZHVjdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fdmVyc2lvbnM/OiBQcmlzbVZlcnNpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQ3JlZGl0IFBhcnRuZXIgSW5zaWdodHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyZWRpdFBhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGludGVnZXIgbnVtYmVyIG9mIGRheXMgb2YgaGlzdG9yeSB0byBjb21wdXRlIENyZWRpdCBQYXJ0bmVyIEluc2lnaHRzLiBEZWZhdWx0cyB0byAxODAgaWYgbm90IHNwZWNpZmllZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgUHJpc20gcHJvZHVjdHMgdG8gcmV0dXJuLiBJZiBub25lIGFyZSBwYXNzZWQgaW4sIHRoZW4gYWxsIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFByaXNtUHJvZHVjdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmlzbV9wcm9kdWN0cz86IEFycmF5PFByaXNtUHJvZHVjdD47XG59XG4vKipcbiAqIChEZXByZWNhdGVkKSBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBEZXBvc2l0IFN3aXRjaCAoYmV0YSkgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZGVwb3NpdF9zd2l0Y2hgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGRlcG9zaXRfc3dpdGNoX2lkYCBwcm92aWRlZCBieSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3REZXBvc2l0U3dpdGNoXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgRW1wbG95bWVudCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBlbXBsb3ltZW50IGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X3NvdXJjZV90eXBlcz86IEFycmF5PEVtcGxveW1lbnRTb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRCYW5rSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZTtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEVtcGxveW1lbnQuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGVtcGxveW1lbnRgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCBgYmFua2AgaXMgc3BlY2lmaWVkIGluIGBlbXBsb3ltZW50X3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgdG8gcmVxdWVzdCBmb3IgdGhlIEJhbmsgRW1wbG95bWVudCBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb24gZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgY29uc2VudD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkIHRvIGEgcHJpdmFjeSBwb2xpY3kgc3BlY2lmeWluZyB0aGF0IHRoZWlyIGRhdGEgd2lsbCBiZSBzaGFyZWQgd2l0aCBQbGFpZCBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzLiAgSWYgYGdhdmVfY29uc2VudGAgaXMgc2V0IHRvIGB0cnVlYCwgdGhlIGBhY2NlcHRfdG9zYCBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBza2lwcGVkYCBhbmQgdGhlIGVuZCB1c2VyXFwncyBzZXNzaW9uIHdpbGwgc3RhcnQgYXQgdGhlIG5leHQgc3RlcCByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZ2F2ZV9jb25zZW50PzogYm9vbGVhbjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgSW5jb21lIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGluY29tZV92ZXJpZmljYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCBvZiB0aGUgdmVyaWZpY2F0aW9uIGluc3RhbmNlLCBhcyBwcm92aWRlZCBieSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYC4gUmVwbGFjZWQgYnkgdGhlIHVzZXIgdG9rZW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgb2YgYW4gYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgYXMgcHJvdmlkZWQgYnkgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gUHJvdmlkaW5nIGFuIGBhc3NldF9yZXBvcnRfaWRgIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHVzZXIgdGhyb3VnaCBhIHN0cmVhbWxpbmVkIGZsb3cuIElmIHByb3ZpZGVkLCB0aGUgYmFuayBsaW5raW5nIGZsb3cgd2lsbCBiZSBza2lwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIHRoYXQgYSB1c2VyIGhhcyBwcmV2aW91c2x5IGNvbm5lY3RlZCB3aXRoLiBEYXRhIGZyb20gdGhlc2UgaW5zdGl0dXRpb25zIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIGRvY3VtZW50IGRhdGEgcmVjZWl2ZWQgZHVyaW5nIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBoZWxwIHZlcmlmeSB0aGF0IHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgYXJlIGFjY3VyYXRlLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGVzZSBJdGVtcyBkdXJpbmcgbGluaywgaXQgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciB0aGlzIExpbmsgc2Vzc2lvbi4gIFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgcGF5cm9sbGAgaW5jb21lIHNvdXJjZSB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgaW5jb21lIGRhdGEgdGhhdCB1c2VycyB3aWxsIGJlIHBlcm1pdHRlZCB0byBzaGFyZS4gT3B0aW9ucyBpbmNsdWRlIGBiYW5rYCBhbmQgYHBheXJvbGxgLiBDdXJyZW50bHkgeW91IGNhbiBvbmx5IHNwZWNpZnkgb25lIG9mIHRoZXNlIG9wdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdGVkX2luY29tZV9zb3VyY2VzPzogQXJyYXk8TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIEJhbmsgSW5jb21lLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIG11bHRpcGxlIEl0ZW1zIHRvIGJlIGFkZGVkIGluIHRoZSBMaW5rIHNlc3Npb24uIFRoaXMgc2V0dGluZyBpcyBkZXByZWNhdGVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbW9yZSBnZW5lcmFsIGBlbmFibGVfbXVsdGlfaXRlbV9saW5rYCBzZXR0aW5nLCB3aGljaCBzdXBwb3J0cyBhbGwgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbmFibGVfbXVsdGlwbGVfaXRlbXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBQYXlyb2xsIEluY29tZSAoaW5jbHVkaW5nIERvY3VtZW50IEluY29tZSkuIEZ1cnRoZXIgY3VzdG9taXphdGlvbiBvcHRpb25zIGZvciBEb2N1bWVudCBJbmNvbWUsIHN1Y2ggYXMgY3VzdG9taXppbmcgd2hpY2ggZG9jdW1lbnQgdHlwZXMgbWF5IGJlIHVwbG9hZGVkLCBhcmUgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBbTGluayBDdXN0b21pemF0aW9uIHBhbmVdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rKSBpbiB0aGUgRGFzaGJvYXJkLiAoUmVxdWlyZXMgUHJvZHVjdGlvbiBlbmFibGVtZW50LilcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiB0byBlbmFibGUgZm9yIHRoZSBMaW5rIHNlc3Npb24uIElmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlbiB1c2VycyB3aWxsIHNlZSBib3RoIGRvY3VtZW50IGFuZCBkaWdpdGFsIHBheXJvbGwgaW5jb21lLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGZsb3dfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGU+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gTGluayB0b2tlbiB3aWxsIGJlIHVzZWQgZm9yIHVwZGF0ZSBtb2RlLiBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGlzX3VwZGF0ZV9tb2RlPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBVbmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIEl0ZW0gdG8gdXBkYXRlIHdpdGguICBUaGlzIGZpZWxkIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHBhcnRpY2lwYW50cyBpbiB0aGUgUGF5cm9sbCBJbmNvbWUgUmVmcmVzaCBiZXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gICAgICovXG4gICAgaXRlbV9pZF90b191cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBhbmFseXNpcyB0byBlbmFibGUgZm9yIGRvY3VtZW50IHVwbG9hZHMuIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCB0aGVuIGRvY3Mgd2lsbCB1bmRlcmdvIE9DUiBwYXJzaW5nIG9ubHkuXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlnPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBQYXkgQnkgQmFuayBmbG93LiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIHRvIGNvbmZpZ3VyZSB0aGUgdXNlciBleHBlcmllbmNlLCBhbmQgY3VycmVudGx5IHJlcXVpcmVzIHRoZSBhbW91bnQgZmllbGQgdG8gYmUgc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2ZlciB0aGF0IHByb3ZpZGVzIHRoZSBwYXltZW50IGNvbnRleHQuIFRoZSBtYXggbGVuZ3RoIGlzIDI1Ni5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5bWVudCBJbml0aWF0aW9uIChFdXJvcGUpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHBheW1lbnRfaW5pdGlhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuIEVpdGhlciBgcGF5bWVudF9pZGAgb3IgYGNvbnNlbnRfaWRgIG11c3QgYmUgcHJvdmlkZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjb25zZW50X2lkYCBwcm92aWRlZCBieSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50SW5pdGlhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFN0YXRlbWVudHMgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgdGhlIHN0YXRlbWVudHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMC0xMC0zMFxcXCIuIFlvdSBjYW4gcmVxdWVzdCB1cCB0byB0d28geWVhcnMgb2YgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFRyYW5zZmVyIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpZGAgcmV0dXJuZWQgYnkgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgaW50ZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaWRgIHJldHVybmVkIGJ5IHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludC4gVXNlZCB0byBpbmRpY2F0ZSBMaW5rIHNlc3Npb24gdG8gY29tcGxldGUgcmVxdWlyZWQgdXNlciBhY3Rpb24gaW4gb3JkZXIgdG8gbWFrZSBhIGRlY2lzaW9uIGZvciB0aGUgYXV0aG9yaXphdGlvbi4gSWYgc2V0LCBgYWNjZXNzX3Rva2VuYCBjYW4gYmUgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCByZXR1cm5lZCBieSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBlbmFibGVzIFt1cGRhdGUgbW9kZSB3aXRoIEFjY291bnQgU2VsZWN0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvI3VzaW5nLXVwZGF0ZS1tb2RlLXRvLXJlcXVlc3QtbmV3LWFjY291bnRzKSBmb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhIHRoYXQgZG8gbm90IHVzZSBPQXV0aCwgb3IgdGhhdCB1c2UgT0F1dGggYnV0IGRvIG5vdCBoYXZlIHRoZWlyIG93biBhY2NvdW50IHNlbGVjdGlvbiBmbG93LiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyB0aGF0IGhhdmUgYW4gT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdyAoaS5lLiBtb3N0IE9BdXRoLWVuYWJsZWQgaW5zdGl0dXRpb25zKSwgdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdCB3aWxsIGFsd2F5cyBiZSBlbmFibGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgYWNjb3VudF9zZWxlY3Rpb25fZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgUGxhaWQgd2lsbCBlbmFibGUgdGhlIHJlYXV0aG9yaXphdGlvbiBmbG93IGR1cmluZyB1cGRhdGUgbW9kZSBmb3IgYW4gSXRlbSBlbmFibGVkIGZvciBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8pIGlmIHRoZSBJdGVtIGV4cGlyZXMgd2l0aGluIHNpeCBtb250aHMuIER1cmluZyBhIHJlYXV0aG9yaXphdGlvbiBmbG93LCBhbiBlbmQgdXNlciB3aWxsIHJldmlldyBQbGFpZFxcJ3MgZW5kIHVzZXIgcHJpdmFjeSBwb2xpY3ksIHVzZSBjYXNlIGFuZCBkYXRhIHNjb3BlIGNvbnNlbnRzLCBhbmQgYWNjb3VudCBhY2Nlc3MgY29uc2VudHM7IHRoZXkgbWF5IGFsc28gYmUgcmVxdWlyZWQgdG8gbG9nIGluIHRvIHRoZWlyIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxcJ3MgT0F1dGggZmxvdy4gQWZ0ZXIgdGhlIGVuZCB1c2VyIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZXMgdGhlIHJlYXV0aG9yaXphdGlvbiBmbG93LCB0aGUgSXRlbVxcJ3MgZXhwaXJhdGlvbiBkYXRlIHdpbGwgYmUgZXh0ZW5kZWQgdG8gMTIgbW9udGhzIGZyb20gdGhlIHRpbWUgdGhhdCB0aGUgcmVhdXRob3JpemF0aW9uIHRvb2sgcGxhY2UuIFRoaXMgZmllbGQgYWxsb3dzIHlvdSB0byBvcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlYXV0aG9yaXphdGlvbiBzY2hlZHVsaW5nIGxvZ2ljIHRvIGVpdGhlciBmb3JjaWJseSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgcmVhdXRob3JpemF0aW9uIGZsb3cgZm9yIGEgZ2l2ZW4gdXBkYXRlIG1vZGUgc2Vzc2lvbi4gVGhpcyBmaWVsZCBkb2VzIG5vdCBpbXBhY3QgdGhlIGZsb3cgZm9yIEl0ZW1zIGF0IGluc3RpdHV0aW9ucyBpbiB0aGUgRVUgb3IgVUsuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICByZWF1dGhvcml6YXRpb25fZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhIGB1c2VyX3Rva2VuYCBtdXN0IGFsc28gYmUgcHJvdmlkZWQsIGFuZCBMaW5rIHdpbGwgb3BlbiBpbiB1cGRhdGUgbW9kZSBmb3IgdGhlIGdpdmVuIHVzZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICB1c2VyPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0byBiZSB1cGRhdGVkIGluIHVwZGF0ZSBtb2RlLiBJZiBlbXB0eSBvciBgbnVsbGAsIHRoaXMgZmllbGQgd2lsbCBkZWZhdWx0IHRvIGluaXRpYWxpemluZyB1cGRhdGUgbW9kZSBmb3IgdGhlIG1vc3QgcmVjZW50IHVuaGVhbHRoeSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gQSBgdXNlcl90b2tlbmAgbXVzdCBhbHNvIGJlIHByb3ZpZGVkIHRvIHVzZSB0aGlzIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlciB3aG8gd2lsbCBiZSBsaW5raW5nIHRoZWlyIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXIge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHJlcHJlc2VudGluZyB0aGUgZW5kIHVzZXIuIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgYSB1c2VyIElEIG51bWJlciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuIEl0IGlzIGN1cnJlbnRseSB1c2VkIGFzIGEgbWVhbnMgb2Ygc2VhcmNoaW5nIGxvZ3MgZm9yIHRoZSBnaXZlbiB1c2VyIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUsIHVzZWQgZm9yIFttaWNyby1kZXBvc2l0IGJhc2VkIHZlcmlmaWNhdGlvbiBmbG93c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuIEZvciBhIHNtYWxsIG51bWJlciBvZiBjdXN0b21lcnMgb24gbGVnYWN5IGZsb3dzLCBwcm92aWRpbmcgdGhpcyBmaWVsZCBpcyByZXF1aXJlZCB0byBlbmFibGUgbWljcm8tZGVwb3NpdC1iYXNlZCBmbG93cy4gRm9yIGFsbCBvdGhlciBjdXN0b21lcnMsIHRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIFByb3ZpZGluZyB0aGUgdXNlclxcJ3MgbmFtZSBpbiB0aGlzIGZpZWxkIHdoZW4gdXNpbmcgbWljcm8tZGVwb3NpdC1iYXNlZCB2ZXJpZmljYXRpb24gd2lsbCBzdHJlYW1saW5lIHRoZSBlbmQgdXNlciBleHBlcmllbmNlLCBhcyB0aGUgdXNlciB3aWxsIG5vdCBiZSBwcm9tcHRlZCB0byBlbnRlciB0aGVpciBuYW1lIGR1cmluZyB0aGUgTGluayBmbG93OyBQbGFpZCB3aWxsIHVzZSB0aGUgcHJvdmlkZWQgbGVnYWwgbmFtZSBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIgaW4gW0UuMTY0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FLjE2NCkgZm9ybWF0LiBJZiBzdXBwbGllZCwgd2lsbCBiZSB1c2VkIHdoZW4gYXBwbGljYWJsZSB0byBwcmVmaWxsIHBob25lIG51bWJlciBmaWVsZHMgaW4gTGluayBmb3IgdGhlIFtyZXR1cm5pbmcgdXNlciBmbG93XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKSBhbmQgdGhlIFtJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvd10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgcGhvbmUgbnVtYmVyIHdhcyB2ZXJpZmllZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGlzIHdhcyBwcmV2aW91c2x5IGFuIG9wdGlvbmFsIGZpZWxkIHVzZWQgaW4gdGhlIFtyZXR1cm5pbmcgdXNlciBleHBlcmllbmNlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvcmV0dXJuaW5nLXVzZXIpLiBUaGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBlbmFibGUgdGhlIHJldHVybmluZyB1c2VyIGV4cGVyaWVuY2UuICAgT25seSBwYXNzIGEgdmVyaWZpY2F0aW9uIHRpbWUgZm9yIGEgcGhvbmUgbnVtYmVyIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvbuKAmXQgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmAgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcl92ZXJpZmllZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy4gQ2FuIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB0aGUgZW1haWwgYWRkcmVzcyB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhbiBlbWFpbCBhZGRyZXNzIHRoYXQgeW91IGhhdmUgdmVyaWZpZWQuIElmIHlvdSBoYXZlIHBlcmZvcm1lZCB2ZXJpZmljYXRpb24gYnV0IGRvbuKAmXQgaGF2ZSB0aGUgdGltZSwgeW91IG1heSBzdXBwbHkgYSBzaWduYWwgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBVTklYIGVwb2NoLiAgIEV4YW1wbGU6IGAyMDIwLTAxLTAxVDAwOjAwOjAwWmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzc192ZXJpZmllZF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIGFuZCBub3QgY3VycmVudGx5IHVzZWQsIHVzZSB0aGUgYGlkX251bWJlcmAgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3NuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRvIGJlIHByb3ZpZGVkIGluIHRoZSBmb3JtYXQgXFxcInl5eXktbW0tZGRcXFwiLiBDYW4gYmUgdXNlZCB0byBwcmVmaWxsIExpbmsgZmllbGRzIHdoZW4gdXNlZCB3aXRoIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVXNlckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBVc2VySUROdW1iZXI7XG59XG4vKipcbiAqIFNwZWNpZmllcyB1c2VyIHN0YXRlZCBpbmNvbWUgc291cmNlcyBmb3IgdGhlIEluY29tZSBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBjb3JyZXNwb25kaW5nIHRvIGFuIGluY29tZSBzb3VyY2Ugc3BlY2lmaWVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGNhdGVnb3J5PzogVXNlclN0YXRlZEluY29tZVNvdXJjZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgcGVyIGN5Y2xlIGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfcGVyX2N5Y2xlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgYW1vdW50IHBhaWQgYW5udWFsbHkgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9hbm51YWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV90eXBlPzogVXNlclN0YXRlZEluY29tZVNvdXJjZVBheVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3k7XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAsIHdoaWNoIGNhbiBiZSBzdXBwbGllZCB0byBMaW5rIGluIG9yZGVyIHRvIGluaXRpYWxpemUgaXQgYW5kIHJlY2VpdmUgYSBgcHVibGljX3Rva2VuYCwgd2hpY2ggY2FuIGJlIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBCeSBkZWZhdWx0LCBhIGBsaW5rX3Rva2VuYCBjcmVhdGVkIHRvIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgdGhhdCB3aWxsIGJlIGV4Y2hhbmdlZCBmb3IgYSBuZXcgYGFjY2Vzc190b2tlbmAgZXhwaXJlcyBhZnRlciA0IGhvdXJzLCBhbmQgYSBgbGlua190b2tlbmAgY3JlYXRlZCBmb3IgYW4gZXhpc3RpbmcgSXRlbSAoc3VjaCBhcyB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGBhY2Nlc3NfdG9rZW5gIGJ5IGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlKSBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIElmIHVzaW5nIFtIb3N0ZWQgTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLyksIHRoZSBgbGlua190b2tlbmAgd2lsbCBleHBpcmUgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgSG9zdGVkIExpbmsgVVJMLCBhbmQgeW91IGNhbiBjdXN0b21pemUgdGhlIGR1cmF0aW9uIHVzaW5nIHRoZSBgaG9zdGVkX2xpbmsudXJsX2xpZmV0aW1lX3NlY29uZHNgIG9wdGlvbiBpbiB0aGUgcmVxdWVzdC4gSWYgdXNpbmcgTGluayBEZWxpdmVyeSAoYmV0YSksIHRoZSBgbGlua190b2tlbmAgd2lsbCBleHBpcmUgYnkgZGVmYXVsdCBhZnRlciAyNCBob3VycyBpZiBzZW50IHZpYSBTTVMgYW5kIGFmdGVyIDcgZGF5cyBpZiBzZW50IHZpYSBlbWFpbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkwgb2YgYSBQbGFpZC1ob3N0ZWQgTGluayBmbG93IHRoYXQgd2lsbCB1c2UgdGhlIExpbmsgdG9rZW4gcmV0dXJuZWQgYnkgdGhpcyByZXF1ZXN0LiBPbmx5IHByZXNlbnQgaWYgdGhlIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgSG9zdGVkIExpbmsuIFRvIGVuYWJsZSB0aGUgc2Vzc2lvbiBmb3IgSG9zdGVkIExpbmssIHNlbmQgYSBgaG9zdGVkX2xpbmtgIG9iamVjdCBpbiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGhvc3RlZF9saW5rX3VybD86IHN0cmluZztcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciBFVSBmbG93c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5FVUNvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIG9wZW4gTGluayB3aXRob3V0IGFuIGluaXRpYWwgVUkuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkVVQ29uZmlnXG4gICAgICovXG4gICAgaGVhZGxlc3M/OiBib29sZWFuO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgYXJndW1lbnRzIG9yaWdpbmFsbHkgcHJvdmlkZWQgdG8gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2R1Y3RzYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGluaXRpYWxfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYHdlYmhvb2tgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvdW50cnlfY29kZXNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgbGFuZ3VhZ2VgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2RhdGE/OiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRGaWx0ZXJzUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZpbHRlcnM/OiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVkaXJlY3RfdXJpYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGNsaWVudF9uYW1lYCBzcGVjaWZpZWQgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGluay90b2tlbi9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua1Rva2VuR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmsvdG9rZW4vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIGBsaW5rX3Rva2VuYCwgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIHRvIExpbmsgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBpdCBhbmQgcmVjZWl2ZSBhIGBwdWJsaWNfdG9rZW5gLCB3aGljaCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIGBsaW5rX3Rva2VuYCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBMaW5rIHNlc3Npb25zIGNyZWF0ZWQgdXNpbmcgdGhpcyBgbGlua190b2tlbmAuIFNlc3Npb24gZGF0YSB3aWxsIGJlIHByb3ZpZGVkIGZvciB1cCB0byBzaXggaG91cnMgYWZ0ZXIgdGhlIHNlc3Npb24gaGFzIGVuZGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25zPzogQXJyYXk8TGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBhIGxpbmsgc2Vzc2lvbi4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIGZvciB0aGUgbGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpcnN0IHN0YXJ0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgc3RhcnRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBsaW5rIHNlc3Npb24gd2FzIGZpbmlzaGVkLCBpZiBhdmFpbGFibGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZmluaXNoZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9uX3N1Y2Nlc3M/OiBMaW5rU2Vzc2lvblN1Y2Nlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvbl9leGl0PzogTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGV4aXQ/OiBMaW5rU2Vzc2lvbkV4aXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgY3VzdG9tZXItcmVsYXRlZCBMaW5rIGV2ZW50c1xuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRzPzogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25SZXN1bHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVzdWx0cz86IExpbmtTZXNzaW9uUmVzdWx0cyB8IG51bGw7XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50cyB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBhbGxvdyBzZWxmLWN1c3RvZHkgY3J5cHRvIHdhbGxldHMgdG8gYmUgYWRkZWQgd2l0aG91dCByZXF1aXJpbmcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBhbGxvd191bnZlcmlmaWVkX2NyeXB0b193YWxsZXRzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHVzZXJzIHRvIG1hbnVhbGx5IGVudGVyIEludmVzdG1lbnRzIGFjY291bnQgYW5kIGhvbGRpbmdzIGluZm9ybWF0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X21hbnVhbF9lbnRyeT86IGJvb2xlYW47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIEludmVzdG1lbnRzIE1vdmUgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGgge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hbnVhbCBlbnRyeSBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYW51YWxfZW50cnlfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgc2hvdyBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgdGhlIG1hc2tlZCBudW1iZXIgbWF0Y2ggZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgbWFza2VkX251bWJlcl9tYXRjaF9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgc3RhdGVkIGFjY291bnQgbnVtYmVyIGZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIHN0YXRlZF9hY2NvdW50X251bWJlcl9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZmVlIGFuZCBjb250cmlidXRpb24gZGV0YWlscyBmb3IgNDAxayBhY2NvdW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICByb2xsb3Zlcl80MDFrX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gVGhlIG1vcmUgdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZXF1ZXN0ZWQsIHRoZSBsb25nZXIgdGhlIGhpc3RvcmljYWwgdXBkYXRlIHBvbGwgd2lsbCB0YWtlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA5MCBkYXlzLiBJZiBhIHZhbHVlIHVuZGVyIDMwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMzAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLiBPbmNlIFRyYW5zYWN0aW9ucyBoYXMgYmVlbiBhZGRlZCB0byBhbiBJdGVtLCB0aGlzIHZhbHVlIGNhbm5vdCBiZSB1cGRhdGVkLiAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlblRyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBXZWJob29rIGluZGljYXRpbmcgdGhhdCB0aGUgc3RhdHVzIG9mIHRoZSBkZWxpdmVyeSBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiB0byBhIHVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYExJTktfREVMSVZFUllgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVMSVZFUllfU1RBVFVTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X21ldGFkYXRhOiBMaW5rRGVsaXZlcnlNZXRhZGF0YTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gYSBtb3J0Z2FnZSBsb2FuIGFncmVlbWVudCBiZXR3ZWVuIG9uZSBvciBtb3JlIGJvcnJvd2VycyBhbmQgYSBtb3J0Z2FnZSBsZW5kZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogTG9hbklkZW50aWZpZXJzO1xufVxuLyoqXG4gKiBWYWxpZCBhY2NvdW50IHN1YnR5cGVzIGZvciBsb2FuIGFjY291bnRzLiBGb3IgYSBsaXN0IGNvbnRhaW5pbmcgZGVzY3JpcHRpb25zIG9mIGVhY2ggc3VidHlwZSwgc2VlIFtBY2NvdW50IHNjaGVtYXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNTdGFuZGFsb25lQWNjb3VudFR5cGUtbG9hbikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuQWNjb3VudFN1YnR5cGUge1xuICAgIEF1dG8gPSAnYXV0bycsXG4gICAgQnVzaW5lc3MgPSAnYnVzaW5lc3MnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIEhvbWVFcXVpdHkgPSAnaG9tZSBlcXVpdHknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgTW9ydGdhZ2UgPSAnbW9ydGdhZ2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgU3R1ZGVudCA9ICdzdHVkZW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgbG9hbmAtdHlwZSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbkZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PExvYW5BY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExvYW5GaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBUaGUgaW5mb3JtYXRpb24gdXNlZCB0byBpZGVudGlmeSB0aGlzIGxvYW4gYnkgdmFyaW91cyBwYXJ0aWVzIHRvIHRoZSB0cmFuc2FjdGlvbiBvciBvdGhlciBvcmdhbml6YXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuSWRlbnRpZmllclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGlkZW50aWZpZXIgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllclxuICAgICAqL1xuICAgIExvYW5JZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllclR5cGV9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyXG4gICAgICovXG4gICAgTG9hbklkZW50aWZpZXJUeXBlOiBMb2FuSWRlbnRpZmllclR5cGUgfCBudWxsO1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgbG9hbiBpZGVudGlmaWVyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTG9hbklkZW50aWZpZXJUeXBlIHtcbiAgICBMZW5kZXJMb2FuID0gJ0xlbmRlckxvYW4nLFxuICAgIFVuaXZlcnNhbExvYW4gPSAnVW5pdmVyc2FsTG9hbidcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGN1cnJlbnQgYW5kIHByZXZpb3VzIGlkZW50aWZpZXJzIGZvciB0aGlzIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5JZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuSWRlbnRpZmllcnNcbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVI6IExvYW5JZGVudGlmaWVyO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGxvYW4gcGF5bWVudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblBheW1lbnRzQ291bnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hblBheW1lbnRzQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGxvYW4gcGF5bWVudHMgbWFkZSBpbiB0aGUgMzAgZGF5cyBiZWZvcmUgdGhlIHN1YnNjcmlwdGlvbiBkYXRlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzQ291bnRzXG4gICAgICovXG4gICAgYmFzZWxpbmVfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgbG9hbiBwYXltZW50cyBtYWRlIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNDb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgdW5pcXVlIGxvYW4gcGF5bWVudCBtZXJjaGFudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50cyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50cyBkZXRlY3RlZCBpbiB0aGUgMzAgZGF5cyBiZWZvcmUgdGhlIHN1YnNjcmlwdGlvbiBkYXRlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHNcbiAgICAgKi9cbiAgICBiYXNlbGluZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50cyBkZXRlY3RlZCBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW50X2NvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBsb2FucyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2luZ2xlIGRlYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FufVxuICAgICAqIEBtZW1iZXJvZiBMb2Fuc1xuICAgICAqL1xuICAgIExPQU46IExvYW47XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2Ygd2hlcmUgYSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBhZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGl0dWRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGxhdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbG9uZ2l0dWRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGxvbjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgZGVmaW5lZCBzdG9yZSBudW1iZXIgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgc3RvcmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG11bHRpLWZhY3RvciBhdXRoZW50aWNhdGlvbiBzZXR0aW5ncyB0byB1c2Ugd2l0aCB0aGlzIHRlc3QgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNRkFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNRkEge1xuICAgIC8qKlxuICAgICAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgYGRldmljZWAsIGBzZWxlY3Rpb25zYCwgb3IgYHF1ZXN0aW9uc2AuICBJZiB2YWx1ZSBpcyBgZGV2aWNlYCwgdGhlIE1GQSBhbnN3ZXIgaXMgYDEyMzRgLiAgSWYgdmFsdWUgaXMgYHNlbGVjdGlvbnNgLCB0aGUgTUZBIGFuc3dlciBpcyBhbHdheXMgdGhlIGZpcnN0IG9wdGlvbi4gIElmIHZhbHVlIGlzIGBxdWVzdGlvbnNgLCB0aGUgTUZBIGFuc3dlciBpcyAgYGFuc3dlcl88aT5fPGo+YCBmb3IgdGhlIGotdGggcXVlc3Rpb24gaW4gdGhlIGktdGggcm91bmQsIHN0YXJ0aW5nIGZyb20gMC4gRm9yIGV4YW1wbGUsIHRoZSBhbnN3ZXIgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIGluIHRoZSBzZWNvbmQgcm91bmQgaXMgYGFuc3dlcl8xXzBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm91bmRzIG9mIHF1ZXN0aW9ucy4gUmVxdWlyZWQgaWYgdmFsdWUgb2YgYHR5cGVgIGlzIGBxdWVzdGlvbnNgLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBxdWVzdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgcXVlc3Rpb25zIHBlciByb3VuZC4gUmVxdWlyZWQgaWYgdmFsdWUgb2YgYHR5cGVgIGlzIGBxdWVzdGlvbnNgLiBJZiB2YWx1ZSBvZiB0eXBlIGlzIGBzZWxlY3Rpb25zYCwgZGVmYXVsdCB2YWx1ZSBpcyAyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uc19wZXJfcm91bmQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2Ygcm91bmRzIG9mIHNlbGVjdGlvbnMsIHVzZWQgaWYgYHR5cGVgIGlzIGBzZWxlY3Rpb25zYC4gRGVmYXVsdHMgdG8gMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNRkFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25fcm91bmRzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGF2YWlsYWJsZSBhbnN3ZXJzIHBlciBxdWVzdGlvbiwgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbmAuIERlZmF1bHRzIHRvIDIuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbnNfcGVyX3F1ZXN0aW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFN1bW1hcnkgb2JqZWN0IHJlZmxlY3RpbmcgdGhlIG1hdGNoIHJlc3VsdCBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1hdGNoU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hdGNoU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIE1hdGNoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFuIGVudW0gaW5kaWNhdGluZyB0aGUgbWF0Y2ggdHlwZSBiZXR3ZWVuIGRhdGEgcHJvdmlkZWQgYnkgdXNlciBhbmQgZGF0YSBjaGVja2VkIGFnYWluc3QgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UuICAgYG1hdGNoYCBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YSB3YXMgYSBzdHJvbmcgbWF0Y2ggYWdhaW5zdCBleHRlcm5hbCBkYXRhLiAgYHBhcnRpYWxfbWF0Y2hgIGluZGljYXRlcyB0aGUgZGF0YSBhcHByb3hpbWF0ZWx5IG1hdGNoZWQgYWdhaW5zdCBleHRlcm5hbCBkYXRhLiBGb3IgZXhhbXBsZSwgXFxcIktub3BlXFxcIiB2cy4gXFxcIktub3BlLVd5YXR0XFxcIiBmb3IgbGFzdCBuYW1lLiAgYG5vX21hdGNoYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSBhbmQgaXQgZGlkIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhhdCBQbGFpZCB3YXMgdW5hYmxlIHRvIGZpbmQgZXh0ZXJuYWwgZGF0YSB0byBjb21wYXJlIGFnYWluc3QgdGhlIHByb3ZpZGVkIGlucHV0IGRhdGEuICBgbm9faW5wdXRgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gcGVyZm9ybSBhIGNoZWNrIGJlY2F1c2Ugbm8gaW5mb3JtYXRpb24gd2FzIHByb3ZpZGVkIGZvciB0aGlzIGZpZWxkIGJ5IHRoZSBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnLFxuICAgIE5vSW5wdXQgPSAnbm9faW5wdXQnXG59XG5cbi8qKlxuICogSW5zaWdodHMgaW50byBhIHVzZXLigJlzIHRvcCBtZXJjaGFudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1lcmNoYW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJjaGFudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgZW50aXR5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBtZXJjaGFudCBvZiB0aGlzIHR5cGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXJjaGFudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9wcmltYXJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRhaWxlZCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIEFsbG93cyBzcGVjaWZ5aW5nIHRoZSBtZXRhZGF0YSBvZiB0aGUgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1ldGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3MgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG9mZmljaWFsIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXRhXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBsaW1pdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBtYXNrLiBTaG91bGQgYmUgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nIG9mIDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gVGhpcyBhbGxvd3MgeW91IHRvIG1vZGVsIGEgbWFzayB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgYWNjb3VudCBudW1iZXIgKHN1Y2ggYXMgd2l0aCBhIHZpcnR1YWwgYWNjb3VudCBudW1iZXIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcmVhc29uIHlvdSBhcmUgZ2VuZXJhdGluZyBhIENvbnN1bWVyIFJlcG9ydCBmb3IgdGhpcyB1c2VyLiAgIGBBQ0NPVU5UX1JFVklFV19DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjb25zdW1lciBjcmVkaXQgdHJhbnNhY3Rpb24gZm9yIHRoZSByZXZpZXcgb3IgY29sbGVjdGlvbiBvZiBhbiBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgV1JJVFRFTl9JTlNUUlVDVElPTl9PVEhFUmA6IEluIGFjY29yZGFuY2Ugd2l0aCB0aGUgd3JpdHRlbiBpbnN0cnVjdGlvbnMgb2YgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMiksIHN1Y2ggYXMgd2hlbiBhbiBpbmRpdmlkdWFsIGFncmVlcyB0byBhY3QgYXMgYSBndWFyYW50b3Igb3IgYXNzdW1lcyBwZXJzb25hbCBsaWFiaWxpdHkgZm9yIGEgY29uc3VtZXIsIGJ1c2luZXNzLCBvciBjb21tZXJjaWFsIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNb25pdG9yaW5nQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2Uge1xuICAgIEFjY291bnRSZXZpZXdDcmVkaXQgPSAnQUNDT1VOVF9SRVZJRVdfQ1JFRElUJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25PdGhlciA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGluY29tZSBzdWJjYXRlZ29yeSBvZiB0aGUgcmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsTW9udGhseUluY29tZUluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICB0b3RhbF9tb250aGx5X2luY29tZTogVG90YWxNb250aGx5SW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVNvdXJjZXNDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50czogSW5jb21lU291cmNlc0NvdW50cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9yZWNhc3RlZE1vbnRobHlJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfbW9udGhseV9pbmNvbWU6IEZvcmVjYXN0ZWRNb250aGx5SW5jb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaXN0b3JpY2FsQW5udWFsSW5jb21lfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2FubnVhbF9pbmNvbWU6IEhpc3RvcmljYWxBbm51YWxJbmNvbWU7XG4gICAgLyoqXG4gICAgICogVGhlIGluY29tZSBzb3VyY2VzIGZvciB0aGlzIEl0ZW0uIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGlzIGEgc2luZ2xlIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7QXJyYXk8TW9uaXRvcmluZ0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzOiBBcnJheTxNb25pdG9yaW5nSW5jb21lU291cmNlPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gbmFtZSBvciBvcmlnaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHVuZGVybHlpbmcgaW5jb21lIHRyYW5zYWN0aW9uc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3J5OiBDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgZGV0ZWN0ZWQgdHJhbnNhY3Rpb24gZGF0ZSBmb3IgdGhpcyBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGxhc3RfdHJhbnNhY3Rpb25fZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBNb25pdG9yaW5nIEluc2lnaHRzIGZvciB0aGUgZ2l2ZW4gSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSW5jb21lSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1xuICAgICAqL1xuICAgIGluY29tZTogTW9uaXRvcmluZ0luY29tZUluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nTG9hbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuczogTW9uaXRvcmluZ0xvYW5JbnNpZ2h0cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgTW9uaXRvcmluZyBJbnNpZ2h0cyBJdGVtXFwncyBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0l0ZW1TdGF0dXNDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzX2NvZGU6IE1vbml0b3JpbmdJdGVtU3RhdHVzQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIHJlYXNvbiBmb3Igd2h5IGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIHdoZW4gdGhlIGBzdGF0dXNfY29kZWAgaXMgbm90IGBBVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEVudW0gZm9yIHRoZSBzdGF0dXMgb2YgdGhlIGluc2lnaHRzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXMge1xuICAgIEF2YWlsYWJsZSA9ICdBVkFJTEFCTEUnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnLFxuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgVW5zdXBwb3J0ZWQgPSAnVU5TVVBQT1JURUQnLFxuICAgIFVuaGVhbHRoeSA9ICdVTkhFQUxUSFknXG59XG5cbi8qKlxuICogRm9yIGVhY2ggdXNlciBlbmFibGVkIGZvciBDYXNoIEZsb3cgVXBkYXRlcywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSBldmVyeSAxNCBkYXlzIHdpdGggaW5mb3JtYXRpb24gb24gdGhlIHN0YXR1cyBvZiB0aGUgdXBkYXRlLiBVcG9uIHJlY2VpdmluZyB0aGUgd2ViaG9vaywgY2FsbCBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGAgdG8gcmV0cmlldmUgdGhlIHVwZGF0ZWQgaW5zaWdodHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX01PTklUT1JJTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNJR0hUU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBNb25pdG9yaW5nSW5zaWdodHNTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiBmb3Igd2h5IGluc2lnaHRzIG1heSBub3QgYmUgYEFWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIHRoYXQgdGhlIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1dlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBFbnVtIGZvciB0aGUgc3RhdHVzIG9mIHRoZSBJdGVtXFwncyBpbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTW9uaXRvcmluZ0l0ZW1TdGF0dXNDb2RlIHtcbiAgICBBdmFpbGFibGUgPSAnQVZBSUxBQkxFJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJyxcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIEl0ZW1Ob3RTdXBwb3J0ZWQgPSAnSVRFTV9OT1RfU1VQUE9SVEVEJyxcbiAgICBJdGVtTG9naW5SZXF1aXJlZCA9ICdJVEVNX0xPR0lOX1JFUVVJUkVEJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGxvYW4gZXhwb3N1cmUgc3ViY2F0ZWdvcnkgb2YgdGhlIHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5QYXltZW50c0NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvYW5fcGF5bWVudHNfY291bnRzOiBMb2FuUGF5bWVudHNDb3VudHM7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBsb2FuIGRpc2J1cnNlbWVudHMgZGV0ZWN0ZWQgaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX2Rpc2J1cnNlbWVudHNfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX3BheW1lbnRfbWVyY2hhbnRzX2NvdW50czogTG9hblBheW1lbnRzTWVyY2hhbnRDb3VudHM7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSBpbnRlcmVzdCByYXRlIGZvciB0aGUgbW9ydGdhZ2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VJbnRlcmVzdFJhdGUge1xuICAgIC8qKlxuICAgICAqIFBlcmNlbnRhZ2UgdmFsdWUgKGludGVyZXN0IHJhdGUgb2YgY3VycmVudCBtb3J0Z2FnZSwgbm90IEFQUikgb2YgaW50ZXJlc3QgcGF5YWJsZSBvbiBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICBwZXJjZW50YWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGludGVyZXN0IGNoYXJnZWQgKGZpeGVkIG9yIHZhcmlhYmxlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBtb3J0Z2FnZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlTGlhYmlsaXR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG91dHN0YW5kaW5nIGFtb3VudCBjaGFyZ2VkIGZvciBsYXRlIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBjdXJyZW50X2xhdGVfZmVlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBoZWxkIGluIGVzY3JvdyB0byBwYXkgdGF4ZXMgYW5kIGluc3VyYW5jZSBvbiBiZWhhbGYgb2YgdGhlIGJvcnJvd2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgZXNjcm93X2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIGhhcyBwcml2YXRlIG1vcnRnYWdlIGluc3VyYW5jZSBpbiBlZmZlY3QuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaGFzX3BtaTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJvcnJvd2VyIHdpbGwgcGF5IGEgcGVuYWx0eSBmb3IgZWFybHkgcGF5b2ZmIG9mIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wcmVwYXltZW50X3BlbmFsdHk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZUludGVyZXN0UmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlOiBNb3J0Z2FnZUludGVyZXN0UmF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgbG9hbiwgZm9yIGV4YW1wbGUgYGNvbnZlbnRpb25hbGAsIGBmaXhlZGAsIG9yIGB2YXJpYWJsZWAuIFRoaXMgZmllbGQgaXMgcHJvdmlkZWQgZGlyZWN0bHkgZnJvbSB0aGUgbG9hbiBzZXJ2aWNlciBhbmQgZG9lcyBub3QgaGF2ZSBhbiBlbnVtZXJhdGVkIHNldCBvZiBwb3NzaWJsZSB2YWx1ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsb2FuX3R5cGVfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRnVsbCBkdXJhdGlvbiBvZiBtb3J0Z2FnZSBhcyBhdCBvcmlnaW5hdGlvbiAoZS5nLiBgMTAgeWVhcmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90ZXJtOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmFsIGRhdGUgb24gd2hpY2ggbW9ydGdhZ2UgaXMgZHVlIGluIGZ1bGwuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBuZXh0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBuZXh0X21vbnRobHlfcGF5bWVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCBwcmluY2lwYWwgYmFsYW5jZSBvZiB0aGUgbW9ydGdhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBsb2FuIChwcmluY2lwYWwgKyBpbnRlcmVzdCkgcGFzdCBkdWUgZm9yIHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwYXN0X2R1ZV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vcnRnYWdlUHJvcGVydHlBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHByb3BlcnR5X2FkZHJlc3M6IE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIHRvIGRhdGUgKFlURCkgaW50ZXJlc3QgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIHl0ZF9pbnRlcmVzdF9wYWlkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBZVEQgcHJpbmNpcGFsIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZpZWxkcyBkZXNjcmliaW5nIHByb3BlcnR5IGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZml2ZSBvciBuaW5lIGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSAoZXhhbXBsZSBcXFwiTkNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyAoZXhhbXBsZSBcXFwiNTY0IE1haW4gU3RyZWV0LCBBcHQgMTVcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgcmlzayBzaWduYWxzIGFuZCByZWxldmFudCBtZXRhZGF0YSBmb3IgYSBzZXQgb2YgdXBsb2FkZWQgZG9jdW1lbnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBhdHRyaWJ1dGVzIHRoYXQgY291bGQgaW5kaWNhdGUgaWYgYSBkb2N1bWVudCBpcyBmcmF1ZHVsZW50XG4gICAgICogQHR5cGUge0FycmF5PFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZT59XG4gICAgICogQG1lbWJlcm9mIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZG9jdW1lbnRfcmVmZXJlbmNlczogQXJyYXk8Umlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBhdHRyaWJ1dGVzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlcmUgaXMgZnJhdWQgcmlzayB3aXRoIGEgc2V0IG9mIGRvY3VtZW50c1xuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogU2NvcmUgZm91bmQgYnkgbWF0Y2hpbmcgbmFtZSBwcm92aWRlZCBieSB0aGUgQVBJIHdpdGggdGhlIG5hbWUgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZU1hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBuYW1lLiAxMDAgaXMgYSBwZXJmZWN0IHNjb3JlLCA5OS04NSBtZWFucyBhIHN0cm9uZyBtYXRjaCwgODQtNzAgaXMgYSBwYXJ0aWFsIG1hdGNoLCBhbnkgc2NvcmUgbGVzcyB0aGFuIDcwIGlzIGEgbWlzbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgbmFtZSBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogZmlyc3Qgb3IgbGFzdCBuYW1lIGNvbXBsZXRlbHkgbWF0Y2hlZCwgbGlrZWx5IGEgZmFtaWx5IG1lbWJlclxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOYW1lTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX2ZpcnN0X25hbWVfb3JfbGFzdF9uYW1lX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogbmlja25hbWUgbWF0Y2hlZCwgZXhhbXBsZSBKZW5uaWZlciBhbmQgSmVubi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19uaWNrbmFtZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElzIGB0cnVlYCBpZiB0aGUgbmFtZSBvbiBlaXRoZXIgb2YgdGhlIG5hbWVzIHRoYXQgd2FzIG1hdGNoZWQgZm9yIHRoZSBzY29yZSBjb250YWluZWQgc3RyaW5ncyBpbmRpY2F0aXZlIG9mIGEgYnVzaW5lc3MgbmFtZSwgc3VjaCBhcyBcXFwiQ09SUFxcXCIsIFxcXCJMTENcXFwiLCBcXFwiSU5DXFxcIiwgb3IgXFxcIkxURFxcXCIuIEEgYHRydWVgIHJlc3VsdCBnZW5lcmFsbHkgaW5kaWNhdGVzIHRoYXQgYW4gYWNjb3VudFxcJ3MgbmFtZSBpcyBhIGJ1c2luZXNzIG5hbWUuIEhvd2V2ZXIsIGEgYGZhbHNlYCByZXN1bHQgZG9lcyBub3QgbWVhbiB0aGUgYWNjb3VudCBuYW1lIGlzIG5vdCBhIGJ1c2luZXNzIG5hbWUsIGFzIHNvbWUgYnVzaW5lc3NlcyBkbyBub3QgdXNlIHRoZXNlIHN0cmluZ3MgaW4gdGhlIG5hbWVzIHVzZWQgZm9yIHRoZWlyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19idXNpbmVzc19uYW1lX2RldGVjdGVkPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldCBwYXkgYW1vdW50IG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXRQYXkge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIG5ldCBwYXkgZm9yIHRoZSBwYXkgcGVyaW9kXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgTmV0UGF5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0b3RhbD86IFRvdGFsO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGFib3V0IHRoZSBjb25uZWN0ZWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c0l0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIHVzZXIgbGlua2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIGRhdGEgZm9yIHRoZSBOZXR3b3JrIEluc2lnaHRzIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBOZXR3b3JrIEluc2lnaHRzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTmV0d29yayBJbnNpZ2h0cyBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIG5ldHdvcmsgYXR0cmlidXRlcywgd2hlcmUgdGhlIGtleSBpcyBhIHN0cmluZywgYW5kIHRoZSB2YWx1ZSBpcyBhIGZsb2F0LCBpbnQsIG9yIGJvb2xlYW4uXG4gICAgICogQHR5cGUge29iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgbmV0d29ya19hdHRyaWJ1dGVzOiBvYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgYWNjZXNzX3Rva2Vucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TmV0d29ya0luc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxOZXR3b3JrSW5zaWdodHNJdGVtPjtcbn1cbi8qKlxuICogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9uZXR3b3JrX2luc2lnaHRzL3JlcG9ydC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2Nlc3MgdG9rZW5zIHRoYXQgdGhlIE5ldHdvcmsgSW5zaWdodHMgd2lsbCBiZSByZXF1ZXN0ZWQgZm9yLiBUaGVzZSBjb3JyZXNwb25kIHRvIHByZXZpb3VzIEl0ZW1zIGEgdXNlciBoYXMgY29ubmVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL25ldHdvcmtfaW5zaWdodHMvcmVwb3J0L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrSW5zaWdodHNSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBOZXR3b3JrSW5zaWdodHNSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9uZXR3b3JrL3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBOZXR3b3JrU3RhdHVzR2V0VXNlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgYSB0ZW1wbGF0ZSBkZWZpbmVkIGluIFBsYWlkIERhc2hib2FyZC4gVGhpcyBmaWVsZCBpcyB1c2VkIGlmIHlvdSBoYXZlIGFkZGl0aW9uYWwgY3JpdGVyaWEgdGhhdCB5b3Ugd2FudCB0byBjaGVjayBhZ2FpbnN0IChlLmcuIExheWVyIGVsaWdpYmlsaXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL25ldHdvcmsvc3RhdHVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV0d29ya19zdGF0dXM6IE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXllcj86IE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIExheWVyLXJlbGF0ZWQgbWV0YWRhdGEgZm9yIHRoZSByZXF1ZXN0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllciB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIExheWVyIHNlc3Npb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyXG4gICAgICovXG4gICAgZWxpZ2libGU6IGJvb2xlYW47XG59XG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBvdmVyYWxsIG5ldHdvcmsgc3RhdHVzIG9mIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBSZXR1cm5pbmdVc2VyID0gJ1JFVFVSTklOR19VU0VSJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbmQgdXNlciBmb3IgdGhlIG5ldHdvcmsgc3RhdHVzIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyIGluIFtFLjE2NF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRS4xNjQpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIFBsYWlkIGRldGVjdHMgYSBuZXcgYWNjb3VudC4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCB5b3UgY2FuIHByb21wdCB5b3VyIHVzZXJzIHRvIHNoYXJlIG5ldyBhY2NvdW50cyB3aXRoIHlvdSB0aHJvdWdoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLyN1c2luZy11cGRhdGUtbW9kZS10by1yZXF1ZXN0LW5ldy1hY2NvdW50cykgKFVTL0NBIG9ubHkpLiBJZiB0aGUgZW5kIHVzZXIgaGFzIG9wdGVkIG5vdCB0byBzaGFyZSBuZXcgYWNjb3VudHMgd2l0aCBQbGFpZCB2aWEgdGhlaXIgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHNldHRpbmdzLCBQbGFpZCB3aWxsIG5vdCBkZXRlY3QgbmV3IGFjY291bnRzIGFuZCB0aGlzIHdlYmhvb2sgd2lsbCBub3QgZmlyZS4gRm9yIGVuZCB1c2VyIGFjY291bnRzIGluIHRoZSBFVSBhbmQgVUssIHVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IGNhbiBwcm9tcHQgeW91ciB1c2VyIHRvIHJlLWxpbmsgdGhlaXIgYWNjb3VudCBhbmQgdGhlbiBkZWxldGUgdGhlIG9sZCBJdGVtIHZpYSBgL2l0ZW0vcmVtb3ZlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpZXIgbnVtYmVyIGRhdGEgdXNlZCB0byBjb25maWd1cmUgdGhlIHRlc3QgYWNjb3VudC4gQWxsIHZhbHVlcyBhcmUgb3B0aW9uYWwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBXaWxsIGJlIHVzZWQgZm9yIHRoZSBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJvdXRpbmcgbnVtYmVyLiBUbyB0ZXN0IGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAsIHNldCB0aGlzIHRvIDMyMjI3MTYyNyB0byBmb3JjZSBhIGB0cnVlYCByZXN1bHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjaF9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfd2lyZV9yb3V0aW5nPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2JyYW5jaGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGVmdF9pbnN0aXR1dGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgYnJhbmNoIG51bWJlci4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBlZnRfaW5zdGl0dXRpb25gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfYnJhbmNoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEJhbmsgaWRlbnRpZmllciBjb2RlIChCSUMpLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGludGVybmF0aW9uYWxfaWJhbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWxfYmljPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IG51bWJlciAoSUJBTikuIElmIG5vIGFjY291bnQgbnVtYmVyIGlzIHNwZWNpZmllZCB2aWEgYGFjY291bnRgLCB3aWxsIGFsc28gYmUgdXNlZCBhcyB0aGUgYWNjb3VudCBudW1iZXIgYnkgZGVmYXVsdC4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2JpY2AuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWxfaWJhbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBCQUNTIHNvcnQgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzX3NvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyB0byBhbiBpbnZlc3RtZW50cyBhY2NvdW50IHZpYSBBQ0FUUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDQVRTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDQVRTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllcnMgZm9yIHRoZSBjbGVhcmluZ2hvdXNlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgaW4gb3JkZXIgb2YgcmVsZXZhbmNlLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgaWYgd2UgY2FuXFwndCBwcm92aWRlIGFueSBhY2NvdW50IGxldmVsIGRhdGEuIEluc3RpdHV0aW9uIGxldmVsIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbnN0aXR1dGlvbnMvZ2V0IGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgZHRjX251bWJlcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNIXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgQXQgY2VydGFpbiBpbnN0aXR1dGlvbnMsIGluY2x1ZGluZyBDaGFzZSBhbmQgUE5DLCB5b3Ugd2lsbCByZWNlaXZlIFxcXCJ0b2tlbml6ZWRcXFwiIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVycywgd2hpY2ggYXJlIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0aGlzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiBhbmQgb24gaG93IHRvIGF2b2lkIGZyYXVkLCB1c2VyIGNvbmZ1c2lvbiwgYW5kIEFDSCByZXR1cm5zLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBudW1iZXIgaXMgdG9rZW5pemVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgaXNfdG9rZW5pemVkX2FjY291bnRfbnVtYmVyPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyBtYXkgYmUgYSB0b2tlbml6ZWQgcm91dGluZyBudW1iZXIuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHJvdXRpbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaWYgdGhlIGluc3RpdHV0aW9uIGlzIGtub3duIHRvIHVzZSBhIHNlcGFyYXRlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIE1hbnkgaW5zdGl0dXRpb25zIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgd2lyZSByb3V0aW5nIG51bWJlciBhbmQgdXNlIHRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHdpcmVzIGluc3RlYWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgdGhlIGVuZCB1c2VyIG1hbnVhbGx5IGNvbmZpcm0gdGhlaXIgd2lyZSByb3V0aW5nIG51bWJlciBiZWZvcmUgc2VuZGluZyBhbnkgd2lyZXMgdG8gdGhlaXIgYWNjb3VudCwgZXNwZWNpYWxseSBpZiB0aGlzIGZpZWxkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBpbnRvIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfaW4/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgb3V0IG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfb3V0PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVTIGFjY291bnQgdmlhIEFDSCBvciB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQUNITnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQUNITnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiAgQXQgY2VydGFpbiBpbnN0aXR1dGlvbnMsIGluY2x1ZGluZyBDaGFzZSBhbmQgUE5DLCB5b3Ugd2lsbCByZWNlaXZlIFxcXCJ0b2tlbml6ZWRcXFwiIHJvdXRpbmcgYW5kIGFjY291bnQgbnVtYmVycywgd2hpY2ggYXJlIG5vdCB0aGUgdXNlclxcJ3MgYWN0dWFsIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycy4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0aGlzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiBhbmQgb24gaG93IHRvIGF2b2lkIGZyYXVkLCB1c2VyIGNvbmZ1c2lvbiwgYW5kIEFDSCByZXR1cm5zLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBhY2NvdW50IG51bWJlciBpcyB0b2tlbml6ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBGb3IgaW1wb3J0YW50IGRldGFpbHMgb24gaG93IHRva2VuaXplZCBhY2NvdW50IG51bWJlcnMgbWF5IGltcGFjdCB5b3VyIGludGVncmF0aW9uLCBzZWUgW1Rva2VuaXplZCBhY2NvdW50IG51bWJlcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC8jdG9rZW5pemVkLWFjY291bnQtbnVtYmVycykuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGlzX3Rva2VuaXplZF9hY2NvdW50X251bWJlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIHJvdXRpbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaWYgdGhlIGluc3RpdHV0aW9uIGlzIGtub3duIHRvIHVzZSBhIHNlcGFyYXRlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIuIE1hbnkgaW5zdGl0dXRpb25zIGRvIG5vdCBoYXZlIGEgc2VwYXJhdGUgd2lyZSByb3V0aW5nIG51bWJlciBhbmQgdXNlIHRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHdpcmVzIGluc3RlYWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGhhdmUgdGhlIGVuZCB1c2VyIG1hbnVhbGx5IGNvbmZpcm0gdGhlaXIgd2lyZSByb3V0aW5nIG51bWJlciBiZWZvcmUgc2VuZGluZyBhbnkgd2lyZXMgdG8gdGhlaXIgYWNjb3VudCwgZXNwZWNpYWxseSBpZiB0aGlzIGZpZWxkIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmc6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIGludG8gdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBjYW5fdHJhbnNmZXJfb3V0PzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQVRPTi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FUT05cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQVRPTiB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQVRPTlxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCQUNTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIHNvcnQgY29kZSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVSyBiYW5rIGFjY291bnQgdmlhIEJBQ1MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1MgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIHNvcnRfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBDYW5hZGlhbiBiYW5rIGFjY291bnQgdmlhIEVGVC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0VGVFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBicmFuY2g6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNFRlROdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBpbnN0aXR1dGlvbiBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRUZUIGJyYW5jaCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJQkFOTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSUJBTk51bGxhYmxlIHtcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCYW5rIElkZW50aWZpZXIgQ29kZSAoQklDKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBBY2NvdW50IG51bWJlcnMgdXNpbmcgdGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciBhbmQgQklDL1NXSUZUIGNvZGUgZm9ybWF0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU4ge1xuICAgIC8qKlxuICAgICAqIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCdXNpbmVzcyBJZGVudGlmaWVyIENvZGUsIGFsc28ga25vd24gYXMgU1dJRlQgY29kZSwgZm9yIHRoaXMgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYW4gaW50ZXJuYXRpb25hbCBiYW5rIGFjY291bnQgdmlhIHdpcmUgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFuayBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZVxuICAgICAqL1xuICAgIGJpYzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVmFsaWQgdmFsdWVzIGFyZSBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPbWl0dGFibGVUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIG9wdGlvbiBzZWN1cml0eS4gIEZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBkYXRhIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgaXRlbSBpcyB1c2luZyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdCwgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyAgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgZm9yY2VfYXZhaWxhYmxlX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVPdmVycmlkZTtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gQW55IGZpZWxkcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZGVmYXVsdCBTYW5kYm94IGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lck92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBuYW1lcyBvZiBpbmRpdmlkdWFscywgZXZlbiBmb3IgYnVzaW5lc3MgYWNjb3VudHMuIE5vdGUgdGhhdCB0aGUgc2FtZSBuYW1lIGRhdGEgd2lsbCBiZSB1c2VkIGZvciBhbGwgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PFBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxFbWFpbD47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgdmFyaW91cyBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz47XG59XG4vKipcbiAqIEhvdyBhbiBhc3NldCBpcyBvd25lZC4gIGBhc3NvY2lhdGlvbmA6IE93bmVyc2hpcCBieSBhIGNvcnBvcmF0aW9uLCBwYXJ0bmVyc2hpcCwgb3IgdW5pbmNvcnBvcmF0ZWQgYXNzb2NpYXRpb24sIGluY2x1ZGluZyBmb3ItcHJvZml0IGFuZCBub3QtZm9yLXByb2ZpdCBvcmdhbml6YXRpb25zLiBgaW5kaXZpZHVhbGA6IE93bmVyc2hpcCBieSBhbiBpbmRpdmlkdWFsLiBgam9pbnRgOiBKb2ludCBvd25lcnNoaXAgYnkgbXVsdGlwbGUgcGFydGllcy4gYHRydXN0YDogT3duZXJzaGlwIGJ5IGEgcmV2b2NhYmxlIG9yIGlycmV2b2NhYmxlIHRydXN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3duZXJzaGlwVHlwZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBJbmRpdmlkdWFsID0gJ2luZGl2aWR1YWwnLFxuICAgIEpvaW50ID0gJ2pvaW50JyxcbiAgICBBc3NvY2lhdGlvbiA9ICdhc3NvY2lhdGlvbicsXG4gICAgVHJ1c3QgPSAndHJ1c3QnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYSBwb3N0IG9mZmljZSBib3guIFdpbGwgYmUgYHllc2Agd2hlbiBhIFAuTy4gYm94IGlzIGRldGVjdGVkLCBgbm9gIHdoZW4gUGxhaWQgY29uZmlybWVkIHRoZSBhZGRyZXNzIGlzIG5vdCBhIFAuTy4gYm94LCBhbmQgYG5vX2RhdGFgIHdoZW4gUGxhaWQgd2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBhIFAuTy4gYm94LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUE9Cb3hTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgc3R1ZGVudFxcJ3MgZWxpZ2liaWxpdHkgaW4gdGhlIFB1YmxpYyBTZXJ2aWNlIExvYW4gRm9yZ2l2ZW5lc3MgcHJvZ3JhbS4gVGhpcyBpcyBvbmx5IHJldHVybmVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBGZWRMb2FuIChgaW5zXzExNjUyN2ApLiBTaW5jZSBGZWRMb2FuIG5vIGxvbmdlciBzZXJ2aWNlcyBzdHVkZW50IGxvYW5zLCB0aGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXR1cm5lZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PFBhcnR5Pjtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuIFRoZSBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgdW5pcXVlIGFuZCBjYW5ub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVjaG5pY2FsX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJpbGxpbmdfY29udGFjdD86IFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfc3VwcG9ydF9pbmZvPzogUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mbztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSBwYXJ0bmVyIGhhcyBmb3J3YXJkZWQgdGhlIFBsYWlkIGJhbmsgYWRkZW5kdW0gdG8gdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2JhbmtfYWRkZW5kdW1fY29tcGxldGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldHNfdW5kZXJfbWFuYWdlbWVudD86IFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgVVJJcyBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbihzKSB3aGVyZSBhIHVzZXIgY2FuIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gVG8gbW9kaWZ5IHJlZGlyZWN0IFVSSXMgZm9yIGFuIGVuZCBjdXN0b21lciBhZnRlciBjcmVhdGluZyB0aGVtLCBnbyB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBbQVBJIHBhZ2VdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBieSByZWd1bGF0b3J5IGF1dGhvcml0aWVzLCBpZiBhcHBsaWNhYmxlLiBGb3IgYmFua3MsIHRoaXMgaXMgdGhlIEZESUMgQ2VydGlmaWNhdGUgTnVtYmVyLiBGb3IgY3JlZGl0IHVuaW9ucywgdGhpcyBpcyB0aGUgQ3JlZGl0IFVuaW9uIENoYXJ0ZXIgTnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpc3RyYXRpb25fbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmxvd2Rvd25fc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBxdWVzdGlvbm5haXJlX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIGluc3RpdHV0aW9ucyB3aXRoIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJlZ2lzdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgYW4gZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRzIHVuZGVyIG1hbmFnZW1lbnQgZm9yIHRoZSBnaXZlbiBlbmQgY3VzdG9tZXIuIFJlcXVpcmVkIGZvciBlbmQgY3VzdG9tZXJzIHdpdGggbW9udGhseSBzZXJ2aWNlIGNvbW1pdG1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBiaWxsaW5nIGNvbnRhY3QgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGJpbGxpbmcgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHB1YmxpYy4gVXNlcnMgb2YgeW91ciBhcHAgd2lsbCBzZWUgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIG1hbmFnaW5nIGNvbm5lY3Rpb25zIGJldHdlZW4geW91ciBhcHAgYW5kIHRoZWlyIGJhbmsgYWNjb3VudHMgaW4gUGxhaWQgUG9ydGFsLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyBjdXN0b21lciBzdXBwb3J0IGluZm8gaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm8ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBjb250YWN0X3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgbGlua191cGRhdGVfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBhZGRlbmR1bSB0byB0aGUgUGxhaWQgTVNBIChcXFwiZmxvd2Rvd25cXFwiKSBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBJblJldmlldyA9ICdJTl9SRVZJRVcnLFxuICAgIE5lZ290aWF0aW9uID0gJ05FR09USUFUSU9OJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgT0F1dGggcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGVudmlyb25tZW50cz86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHM7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24gd2FzIGFwcHJvdmVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZWlyIGFwcGxpY2F0aW9uIGhhcyBub3QgeWV0IGJlZW4gYXBwcm92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3Rpb25fZW5hYmxlbWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCBub24tT0F1dGggSXRlbSBhZGRzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBmb3IgdGhpcyBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggZGF0ZSBoYXMgYmVlbiBzZXQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjbGFzc2ljX2Rpc2FibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cmF0aW9uIHN0YXR1cyBmb3IgdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIEVuYWJsZWQgPSAnRU5BQkxFRCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnQVRURU5USU9OX1JFUVVJUkVEJ1xufVxuXG4vKipcbiAqIFJlZ2lzdHJhdGlvbiBzdGF0dXNlcyBieSBlbnZpcm9ubWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogVGhlIE9BdXRoIHN0YXR1cyBvZiB0aGUgdXBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnbm90LXN0YXJ0ZWQnLFxuICAgIFByb2Nlc3NpbmcgPSAncHJvY2Vzc2luZycsXG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIEVuYWJsZWQgPSAnZW5hYmxlZCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnYXR0ZW50aW9uLXJlcXVpcmVkJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIG9mIHR5cGUgYFBBUlRORVJgIGFuZCBjb2RlIGBFTkRfQ1VTVE9NRVJfT0FVVEhfU1RBVFVTX1VQREFURURgIHdpbGwgYmUgZmlyZWQgd2hlbiBhIHBhcnRuZXJcXCdzIGVuZCBjdXN0b21lciBoYXMgYW4gdXBkYXRlIG9uIHRoZWlyIE9BdXRoIHJlZ2lzdHJhdGlvbiBzdGF0dXMgd2l0aCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjdXJpdHkgcXVlc3Rpb25uYWlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFJlY2VpdmVkID0gJ1JFQ0VJVkVEJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0cyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIHNhbmRib3g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LiBUaGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGhlIGVuZCBjdXN0b21lciB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBsaW1pdGVkIG51bWJlciBvZiBjcmVkaXRzIHRvIHRlc3QgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYmVmb3JlIGZ1bGwgZW5hYmxlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZW5kIGN1c3RvbWVyLiAgYFVOREVSX1JFVklFV2A6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24uIFRoZSBlbmQgY3VzdG9tZXIgbXVzdCBiZSBtYW51YWxseSByZXZpZXdlZCBieSB0aGUgUGxhaWQgdGVhbSBiZWZvcmUgaXQgY2FuIGJlIGVuYWJsZWQgaW4gZnVsbCBwcm9kdWN0aW9uLCBhdCB3aGljaCBwb2ludCBpdHMgc3RhdHVzIHdpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0aW9uIHRvIGBQRU5ESU5HX0VOQUJMRU1FTlRgIG9yIGBERU5JRURgLiAgYFBFTkRJTkdfRU5BQkxFTUVOVGA6IFRoZSBlbmQgY3VzdG9tZXIgaXMgcmVhZHkgdG8gYmUgZnVsbHkgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gQ2FsbCB0aGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgdG8gZW5hYmxlIHRoZSBlbmQgY3VzdG9tZXIgaW4gZnVsbCBQcm9kdWN0aW9uLiAgYEFDVElWRWA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gZnVsbHkgZW5hYmxlZCBpbiBhbGwgZW52aXJvbm1lbnRzLiAgYERFTklFRGA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24sIGJ1dCBpdCBkaWQgbm90IHBhc3MgcmV2aWV3IGJ5IHRoZSBQbGFpZCB0ZWFtIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGVuYWJsZWQgZm9yIGZ1bGwgUHJvZHVjdGlvbiBhY2Nlc3MuIFRhbGsgdG8geW91ciBBY2NvdW50IE1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXMge1xuICAgIFVuZGVyUmV2aWV3ID0gJ1VOREVSX1JFVklFVycsXG4gICAgUGVuZGluZ0VuYWJsZW1lbnQgPSAnUEVORElOR19FTkFCTEVNRU5UJyxcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBEZW5pZWQgPSAnREVOSUVEJ1xufVxuXG4vKipcbiAqIFRoZSB0ZWNobmljYWwgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgdGVjaG5pY2FsIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBhcnR5IHRvIGEgdHJhbnNhY3Rpb24uIEluY2x1ZGVkIGRpcmVjdCBwYXJ0aWNpcGFudHMgbGlrZSB0aGUgYm9ycm93ZXIgYW5kIHNlbGxlciBhcyB3ZWxsIGFzIGluZGlyZWN0IHBhcnRpY2lwYW50cyBzdWNoIGFzIHRoZSBmbG9vZCBjZXJ0aWZpY2F0ZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5SW5kaXZpZHVhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFJPTEVTOiBSb2xlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogSW5kaXZpZHVhbE5hbWU7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uQSB2YWx1ZSBmcm9tIGEgTUlTTU8gZGVmaW5lZCBsaXN0IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9sZSB0aGF0IHRoZSBwYXJ0eSBwbGF5cyBpbiB0aGUgdHJhbnNhY3Rpb24uIFBhcnRpZXMgbWF5IGJlIGVpdGhlciBhIHBlcnNvbiBvciBsZWdhbCBlbnRpdHkuIEEgcGFydHkgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMgaW4gYSB0cmFuc2FjdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnR5Um9sZVR5cGUge1xuICAgIEJvcnJvd2VyID0gJ0JvcnJvd2VyJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtb25ldGFyeSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgLyoqXG4gICAgICogQSBudW1lcmljYWwgYW1vdW50IG9mIGEgc3BlY2lmaWMgY3VycmVuY3kuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW5jeSBjb2RlLCBlLmcuIFVTRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5VmFsdWV9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZhbHVlOiBQYXlGcmVxdWVuY3lWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlGcmVxdWVuY3lWYWx1ZSB7XG4gICAgTW9udGhseSA9ICdtb250aGx5JyxcbiAgICBTZW1pbW9udGhseSA9ICdzZW1pbW9udGhseScsXG4gICAgV2Vla2x5ID0gJ3dlZWtseScsXG4gICAgQml3ZWVrbHkgPSAnYml3ZWVrbHknLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlfZGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBzdGFydCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB7XG4gICAgUGF5RnJlcXVlbmN5VW5rbm93biA9ICdQQVlfRlJFUVVFTkNZX1VOS05PV04nLFxuICAgIFBheUZyZXF1ZW5jeVdlZWtseSA9ICdQQVlfRlJFUVVFTkNZX1dFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5Qml3ZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9CSVdFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5U2VtaW1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9TRU1JTU9OVEhMWScsXG4gICAgUGF5RnJlcXVlbmN5TW9udGhseSA9ICdQQVlfRlJFUVVFTkNZX01PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd246IEFycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgcGVyaW9kIGVuZGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5nczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgc3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2Jhc2lzPzogQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBzdGFydGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcGF5bWVudC4gRm9yIHN0YW5kaW5nIG9yZGVycyBhbmQgcGF5bWVudCBjb25zZW50cywgYFxcXCJHQlBcXFwiYCBtdXN0IGJlIHVzZWQuIEZvciBQb2xhbmQsIERlbm1hcmssIFN3ZWRlbiBhbmQgTm9yd2F5LCBvbmx5IHRoZSBsb2NhbCBjdXJyZW5jeSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5IHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJyxcbiAgICBQbG4gPSAnUExOJyxcbiAgICBTZWsgPSAnU0VLJyxcbiAgICBEa2sgPSAnREtLJyxcbiAgICBOb2sgPSAnTk9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q2hhbm5lbCB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogTWF4aW11bSBhbW91bnQgb2YgYSBzaW5nbGUgcGF5bWVudCBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBXaGVyZSB0aGUgcGF5bWVudCBjb25zZW50IHBlcmlvZCBzaG91bGQgc3RhcnQuICBJZiB0aGUgaW5zdGl0dXRpb24gaXMgTW9uem8sIG9ubHkgYENPTlNFTlRgIGFsaWdubWVudHMgYXJlIHN1cHBvcnRlZC4gIGBDQUxFTkRBUmA6IGxpbmUgdXAgd2l0aCBhIGNhbGVuZGFyLiAgYENPTlNFTlRgOiBvbiB0aGUgZGF0ZSBvZiBjb25zZW50IGNyZWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0FsaWdubWVudCB7XG4gICAgQ2FsZW5kYXIgPSAnQ0FMRU5EQVInLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGNvbnNlbnQgcGF5bWVudHMgbGltaXRhdGlvbnMgcGVyIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHBlcmlvZGljIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsIHtcbiAgICBEYXkgPSAnREFZJyxcbiAgICBXZWVrID0gJ1dFRUsnLFxuICAgIE1vbnRoID0gJ01PTlRIJyxcbiAgICBZZWFyID0gJ1lFQVInXG59XG5cbi8qKlxuICogTGlmZSBzcGFuIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBBZnRlciB0aGUgYHRvYCBkYXRlIHRoZSBwYXltZW50IGNvbnNlbnQgZXhwaXJlcyBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGZvciBwYXltZW50IGluaXRpYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgZnJvbSB3aGljaCB0aGUgY29uc2VudCBzaG91bGQgYmUgYWN0aXZlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgZnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIGNvbnNlbnQgZXhwaXJlcywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIHRvPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50XFwncyBiYW5rIGFjY291bnQuIFJlcXVpcmVkIGJ5IG1vc3QgaW5zdGl0dXRpb25zIG91dHNpZGUgb2YgdGhlIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCB1c2UgdGhlIFxcJ3R5cGVcXCcgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogTGltaXRhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gcGF5bWVudHMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgdmFsaWRfZGF0ZV90aW1lPzogUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIG1heF9wYXltZW50X2Ftb3VudDogUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbW91bnQgbGltaXRhdGlvbnMgcGVyIHBlcmlvZCBvZiB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICBwZXJpb2RpY19hbW91bnRzOiBBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pjtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuIFRoZSBjcmVhdGVkIGNvbnNlbnQgY2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgZnVuZHMgdG8gdGhpcyByZWNpcGllbnQgb25seS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge1NldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IFNldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlPzogUGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQsIHVzZSB0aGUgXFwndHlwZVxcJyBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzY29wZXM/OiBBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5ZXJfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGF5bWVudCBjb25zZW50IHBheWVyIGRldGFpbHMuICBQYXllciBgbmFtZWAgYW5kIGFjY291bnQgYG51bWJlcnNgIGFyZSByZXF1aXJlZCB0byBsb2NrIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBjb25zZW50IGNhbiBiZSBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXllciBhcyBpdCBhcHBlYXJzIGluIHRoZWlyIGJhbmsgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBiaXJ0aGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBwaG9uZSBudW1iZXJzIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfVxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0lCQU5OdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzXG4gICAgICovXG4gICAgaWJhbj86IE51bWJlcnNJQkFOTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgY29uc2VudCBwYXltZW50LiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIGNvbnNlbnQgcGF5bWVudCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBwYXltZW50IGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHBheW1lbnQgdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gNDggaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSWYgbm90IHByb3ZpZGVkLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIHRvIHRoZSByZWZlcmVuY2UgZnJvbSBjb25zZW50LiBJbiBvcmRlciB0byB0cmFjayBzZXR0bGVtZW50IHZpYSBQYXltZW50IENvbmZpcm1hdGlvbiwgZWFjaCBwYXltZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSByZWZlcmVuY2UuIElmIHRoZSByZWZlcmVuY2UgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQVBJIGlzIG5vdCB1bmlxdWUsIFBsYWlkIHdpbGwgYWRqdXN0IGl0LiBTb21lIGluc3RpdHV0aW9ucyBtYXkgbGltaXQgdGhlIHJlZmVyZW5jZSB0byBsZXNzIHRoYW4gMTggY2hhcmFjdGVycy4gSWYgbmVjZXNzYXJ5LCBQbGFpZCB3aWxsIGFkanVzdCB0aGUgcmVmZXJlbmNlIGJ5IHRydW5jYXRpbmcgaXQgdG8gZml0IHRoZSBpbnN0aXR1dGlvblxcJ3MgcmVxdWlyZW1lbnRzLiBCb3RoIHRoZSBvcmlnaW5hbGx5IHByb3ZpZGVkIGFuZCBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHJlZmVyZW5jZXMgKGlmIGFueSkgY2FuIGJlIGZvdW5kIGluIHRoZSBgcmVmZXJlbmNlYCBhbmQgYGFkanVzdGVkX3JlZmVyZW5jZWAgZmllbGRzLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUgJiBzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZSAmIHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UHJvY2Vzc2luZ01vZGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NpbmdfbW9kZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWNpZGVzIHRoZSBtb2RlIHVuZGVyIHdoaWNoIHRoZSBwYXltZW50IHByb2Nlc3Npbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCwgdXNpbmcgYElNTUVESUFURWAgYXMgZGVmYXVsdC4gIGBJTU1FRElBVEVgOiBXaWxsIGltbWVkaWF0ZWx5IGV4ZWN1dGUgdGhlIHBheW1lbnQsIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVNQU1AgYmVmb3JlIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwYXltZW50IGluaXRpYXRpb24uIFRoaXMgaXMgaWRlYWwgZm9yIHVzZXItcHJlc2VudCBmbG93cy4gICBgQVNZTkNgOiBXaWxsIGFjY2VwdCBhIHBheW1lbnQgZXhlY3V0aW9uIHJlcXVlc3QgYW5kIHNjaGVkdWxlIGl0IGZvciBwcm9jZXNzaW5nLCBpbW1lZGlhdGVseSByZXR1cm5pbmcgdGhlIG5ldyBgcGF5bWVudF9pZGAuIExpc3RlbiBmb3Igd2ViaG9va3Mgb3IgdXNlIHRoZSBbYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbnBheW1lbnRnZXQpIGVuZHBvaW50IHRvIG9idGFpbiB1cGRhdGVzIG9uIHRoZSBwYXltZW50IHN0YXR1cy4gVGhpcyBpcyBpZGVhbCBmb3Igbm9uIHVzZXItcHJlc2VudCBmbG93cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlIHtcbiAgICBBc3luYyA9ICdBU1lOQycsXG4gICAgSW1tZWRpYXRlID0gJ0lNTUVESUFURSdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgY29uc2VudCBgdHlwZWAgZmllbGQuIENvbnNlbnRzIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgc2luZ2xlIHR5cGUuICAgUGF5bWVudCBjb25zZW50IHNjb3BlLiBEZWZpbmVzIHBvc3NpYmxlIGRpcmVjdGlvbnMgZm9yIHBheW1lbnRzIG1hZGUgd2l0aCB0aGUgZ2l2ZW4gY29uc2VudC4gIGBNRV9UT19NRWA6IEFsbG93cyBtb3ZpbmcgbW9uZXkgYmV0d2VlbiBhY2NvdW50cyBvd25lZCBieSB0aGUgc2FtZSB1c2VyLiAgYEVYVEVSTkFMYDogQWxsb3dzIGluaXRpYXRpbmcgcGF5bWVudHMgZnJvbSB0aGUgdXNlclxcJ3MgYWNjb3VudCB0byB0aGlyZCBwYXJ0aWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUge1xuICAgIE1lVG9NZSA9ICdNRV9UT19NRScsXG4gICAgRXh0ZXJuYWwgPSAnRVhURVJOQUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudCBjb25zZW50LiAgYFVOQVVUSE9SSVNFRGA6IENvbnNlbnQgY3JlYXRlZCwgYnV0IHJlcXVpcmVzIHVzZXIgYXV0aG9yaXNhdGlvbi4gIGBSRUpFQ1RFRGA6IENvbnNlbnQgYXV0aG9yaXNhdGlvbiB3YXMgcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYW5kL29yIHRoZSBiYW5rLiAgYEFVVEhPUklTRURgOiBDb25zZW50IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gIGBSRVZPS0VEYDogQ29uc2VudCBoYXMgYmVlbiByZXZva2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICBgRVhQSVJFRGA6IENvbnNlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzIHtcbiAgICBVbmF1dGhvcmlzZWQgPSAnVU5BVVRIT1JJU0VEJyxcbiAgICBBdXRob3Jpc2VkID0gJ0FVVEhPUklTRUQnLFxuICAgIFJldm9rZWQgPSAnUkVWT0tFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUkVKRUNURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ09OU0VOVF9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCBmb3IgdGhlIGNvbnNlbnQgYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgdHlwZS4gRGVmaW5lcyBwb3NzaWJsZSB1c2UgY2FzZSBmb3IgcGF5bWVudHMgbWFkZSB3aXRoIHRoZSBnaXZlbiBjb25zZW50LiAgYFNXRUVQSU5HYDogQWxsb3dzIG1vdmluZyBtb25leSBiZXR3ZWVuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIuICBgQ09NTUVSQ0lBTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGUge1xuICAgIFN3ZWVwaW5nID0gJ1NXRUVQSU5HJyxcbiAgICBDb21tZXJjaWFsID0gJ0NPTU1FUkNJQUwnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIFNFUEEgSW5zdGFudCBwYXltZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3NlcGFfaW5zdGFudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudCBjb25zZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3BheW1lbnRfY29uc2VudHM6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB1c2VkIHRvIHJlc3RyaWN0IHRoZSBhY2NvdW50cyB1c2VkIGZvciBwYXltZW50cy4gSWYgcHJvdmlkZWQsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50UmVmdW5kZWR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZvciBhIHBheW1lbnQgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCwgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgdmFsdWU6ICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhlIGluaXRpYWwgcGhhc2Ugb2YgdGhlIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cyB7XG4gICAgUGF5bWVudFN0YXR1c0lucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlZnVuZCBJRHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXltZW50cyB0byByZXR1cm4uIElmIGBjb3VudGAgaXMgbm90IHNwZWNpZmllZCwgYSBtYXhpbXVtIG9mIDEwIHBheW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQsIGJlZ2lubmluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBwYXltZW50IGJlZm9yZSB0aGUgY3Vyc29yIChpZiBzcGVjaWZpZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBcXFwiMjAxOS0xMi0wNlQyMjozNTo0OVpcXFwiKS4gT25seSBwYXltZW50cyBjcmVhdGVkIGJlZm9yZSB0aGUgY3Vyc29yIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELiBJZiBzcGVjaWZpZWQsIG9ubHkgcGF5bWVudHMsIGV4ZWN1dGVkIHVzaW5nIHRoaXMgY29uc2VudCwgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgY2xpZW50X2lkYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudHM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uUGF5bWVudD47XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIHRoYXQsIHdoZW4gdXNlZCBhcyB0aGUgb3B0aW9uYWwgYGN1cnNvcmAgcGFyYW1ldGVyIHRvIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAsIHdpbGwgcmV0dXJuIHRoZSBuZXh0IHVucmV0dXJuZWQgcGF5bWVudCBhcyBpdHMgZmlyc3QgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdG8gcmV2ZXJzZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHdhbGxldCB0cmFuc2FjdGlvbi4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gSWYgYSByZXF1ZXN0IHRvIGV4ZWN1dGUgYSB3YWxsZXQgdHJhbnNhY3Rpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB0aGVuIGFmdGVyIGEgbWluaW11bSBkZWxheSBvZiBvbmUgbWludXRlLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2FsbGV0IHRyYW5zYWN0aW9uIGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHRyYW5zYWN0aW9uIHRoYXQgdXNlcyB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXksIGFuZCB3YXMgcmVjZWl2ZWQgd2l0aGluIDI0IGhvdXJzIG9mIHRoZSBmaXJzdCByZXF1ZXN0LCBmcm9tIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcmVmdW5kLiBUaGlzIG11c3QgYmUgYW4gYWxwaGFudW1lcmljIHN0cmluZyB3aXRoIDYgdG8gMTggY2hhcmFjdGVycyBhbmQgbXVzdCBub3QgY29udGFpbiBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50VG9SZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50PzogUGF5bWVudEFtb3VudFRvUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHlcXCdzIGJpcnRoZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9kYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eV9hZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlZnVuZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBwYXltZW50LiAgYFBBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRGA6IFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgYWxsIHBheW1lbnRzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcGF5bWVudCBpcyB3YWl0aW5nIG9uIHVzZXIgaW5wdXQgdG8gY29udGludWUgcHJvY2Vzc2luZy4gQSBwYXltZW50IG1heSByZS1lbnRlciB0aGlzIHN0YXRlIGxhdGVyIG9uIGlmIGZ1cnRoZXIgaW5wdXQgaXMgbmVlZGVkLiAgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGA6IFRoZSBwYXltZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhdXRob3Jpc2VkIGFuZCBhY2NlcHRlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBGb3Igc3VjY2Vzc2Z1bCBwYXltZW50cywgdGhpcyBpcyBhIHBvdGVudGlhbCB0ZXJtaW5hbCBzdGF0dXMuIEZ1cnRoZXIgc3RhdHVzIHRyYW5zaXRpb25zIGNhbiBiZSB0byBSRUpFQ1RFRCBhbmQsIHdoZW4gc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgdG8gRVhFQ1VURUQuICBgUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFBBWU1FTlRfU1RBVFVTX0ZBSUxFRGA6IFRoZSBwYXltZW50IGhhcyBmYWlsZWQgdG8gYmUgaW5pdGlhdGVkLiBUaGlzIGVycm9yIG1heSBiZSBjYXVzZWQgYnkgdHJhbnNpZW50IHN5c3RlbSBvdXRhZ2VzIGFuZCBpcyByZXRyeWFibGUgb25jZSB0aGUgcm9vdCBjYXVzZSBpcyByZXNvbHZlZC4gIGBQQVlNRU5UX1NUQVRVU19CTE9DS0VEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gYmxvY2tlZCBieSBQbGFpZC4gVGhpcyBjYW4gb2NjdXIsIGZvciBleGFtcGxlLCBkdWUgdG8gUGxhaWQgZmxhZ2dpbmcgdGhlIHBheW1lbnQgYXMgcG90ZW50aWFsbHkgcmlza3kuIFRoaXMgaXMgYSByZXRyeWFibGUgZXJyb3IuICBgUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBoYXMgYXV0aG9yaXNlZCB0aGUgdHJhbnNhY3Rpb24uICBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYDogVGhlIHBheW1lbnQgd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSBlbmQgdXNlcikgZHVyaW5nIGF1dGhvcmlzYXRpb24uICBgUEFZTUVOVF9TVEFUVVNfRVhFQ1VURURgOiBUaGUgZnVuZHMgaGF2ZSBzdWNjZXNzZnVsbHkgbGVmdCB0aGUgcGF5ZXIgYWNjb3VudCBhbmQgcGF5bWVudCBpcyBjb25zaWRlcmVkIGNvbXBsZXRlLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBzdXBwb3J0IHRoaXMgc3RhdHVzOiBzdXBwb3J0IGlzIG1vcmUgY29tbW9uIGluIHRoZSBVSywgYW5kIGxlc3MgY29tbW9uIGluIHRoZSBFVS4gRm9yIGluc3RpdHV0aW9ucyB3aGVyZSB0aGlzIHN0YXR1cyBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgdGVybWluYWwgc3RhdHVzIGZvciBhIHN1Y2Nlc3NmdWwgcGF5bWVudCB3aWxsIGJlIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgLiAgYFBBWU1FTlRfU1RBVFVTX1NFVFRMRURgOiBUaGUgcGF5bWVudCBoYXMgc2V0dGxlZCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLiBBIHBheW1lbnQgd2lsbCB0eXBpY2FsbHkgc2V0dGxlIHdpdGhpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHdoaWNoIHBheW1lbnQgcmFpbCBpcyB1c2VkLiBUaGlzIHN0YXR1cyBpcyBvbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgdXNpbmcgW1BsYWlkIFZpcnR1YWwgQWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdmlydHVhbC1hY2NvdW50cy8pLiAgYFBBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEYDogSW5kaWNhdGVzIHRoYXQgdGhlIHN0YW5kaW5nIG9yZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gVGhpcyBzdGF0ZSBpcyBvbmx5IHVzZWQgZm9yIHN0YW5kaW5nIG9yZGVycy4gIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGA6IFRoZSBwYXltZW50IHdhcyByZWplY3RlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRGVwcmVjYXRlZDogVGhlc2Ugc3RhdHVzZXMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuICBgUEFZTUVOVF9TVEFUVVNfVU5LTk9XTmA6IFRoZSBwYXltZW50IHN0YXR1cyBpcyB1bmtub3duLiAgYFBBWU1FTlRfU1RBVFVTX1BST0NFU1NJTkdgOiBUaGUgcGF5bWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgcGF5bWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZXhpdCB0aGlzIHN0YXRlIHdoZW4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZS4gIGBQQVlNRU5UX1NUQVRVU19DT01QTEVURURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzIHtcbiAgICBJbnB1dE5lZWRlZCA9ICdQQVlNRU5UX1NUQVRVU19JTlBVVF9ORUVERUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lORycsXG4gICAgSW5pdGlhdGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRCcsXG4gICAgQ29tcGxldGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRCcsXG4gICAgSW5zdWZmaWNpZW50RnVuZHMgPSAnUEFZTUVOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0ZVTkRTJyxcbiAgICBGYWlsZWQgPSAnUEFZTUVOVF9TVEFUVVNfRkFJTEVEJyxcbiAgICBCbG9ja2VkID0gJ1BBWU1FTlRfU1RBVFVTX0JMT0NLRUQnLFxuICAgIFVua25vd24gPSAnUEFZTUVOVF9TVEFUVVNfVU5LTk9XTicsXG4gICAgRXhlY3V0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfRVhFQ1VURUQnLFxuICAgIFNldHRsZWQgPSAnUEFZTUVOVF9TVEFUVVNfU0VUVExFRCcsXG4gICAgQXV0aG9yaXNpbmcgPSAnUEFZTUVOVF9TVEFUVVNfQVVUSE9SSVNJTkcnLFxuICAgIENhbmNlbGxlZCA9ICdQQVlNRU5UX1NUQVRVU19DQU5DRUxMRUQnLFxuICAgIEVzdGFibGlzaGVkID0gJ1BBWU1FTlRfU1RBVFVTX0VTVEFCTElTSEVEJyxcbiAgICBSZWplY3RlZCA9ICdQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCByZXR1cm5lZCBmcm9tIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYHBheW1lbnRfdG9rZW5gIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgdGhlIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgdG9rZW4gd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQSBgcGF5bWVudF90b2tlbmAgZXhwaXJlcyBhZnRlciAxNSBtaW51dGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X3Rva2VuX2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHJlY2lwaWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuIFdlIHJlY29tbWVuZCB1c2luZyBzdHJpbmdzIG9mIGxlbmd0aCAxOCBvciBsZXNzIGFuZCBhdm9pZCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBhbGwgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC4gSWYgQkFDUyBkYXRhIGlzIG5vdCBwcm92aWRlZCwgYW4gSUJBTiBpcyByZXF1aXJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjaXBpZW50QkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vcmVjaXBpZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VBbGxPZlxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50IHJlY2lwaWVudHMgY3JlYXRlZCBmb3IgUGF5bWVudCBJbml0aWF0aW9uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRzOiBBcnJheTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB2YWxpZCBQYXltZW50IEluaXRpYXRpb24gc3RhbmRpbmcgb3JkZXIgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIGNsb3NlZC1lbmRlZCBzdGFuZGluZyBvcmRlcnMgYnkgcHJvdmlkaW5nIGFuIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX2VuZF9kYXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGBNT05USExZYCBzdGFuZGluZyBvcmRlcnMuIEluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyBuZWdhdGl2ZSBpbnRlZ2VycyAoLTEgdG8gLTUpIGZvciBzZXR0aW5nIHVwIGEgYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3N0YW5kaW5nX29yZGVyX25lZ2F0aXZlX2V4ZWN1dGlvbl9kYXlzOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgdmFsaWQgc3RhbmRpbmcgb3JkZXIgaW50ZXJ2YWxzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25TdGFuZGluZ09yZGVyTWV0YWRhdGFcbiAgICAgKi9cbiAgICB2YWxpZF9zdGFuZGluZ19vcmRlcl9pbnRlcnZhbHM6IEFycmF5PFBheW1lbnRTY2hlZHVsZUludGVydmFsPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gaW50ZXItYmFuayB0cmFuc2ZlcnMuIElmIHRoZSB0cmFuc2FjdGlvbiB3YXMgbm90IGFuIGludGVyLWJhbmsgdHJhbnNmZXIsIGFsbCBmaWVsZHMgd2lsbCBiZSBgbnVsbGAuICBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhIFRyYW5zYWN0aW9ucyBlbmRwb2ludCBzdWNoIGFzIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoZSBgcGF5bWVudF9tZXRhYCBrZXkgd2lsbCBhbHdheXMgYXBwZWFyLCBidXQgbm8gZGF0YSBlbGVtZW50cyBhcmUgZ3VhcmFudGVlZC4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudE1ldGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50TWV0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSBudW1iZXIgc3VwcGxpZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlZmVyZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCBQUEQgSUQgZm9yIHRoZSBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBwZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNmZXJzLCB0aGUgcGFydHkgdGhhdCBpcyByZWNlaXZpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnR5IGluaXRpYXRpbmcgYSB3aXJlIHRyYW5zZmVyLiBXaWxsIGJlIGBudWxsYCBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGEgd2lyZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIGJ5X29yZGVyX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHBheWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0cmFuc2ZlciwgZS5nLiBcXCdBQ0hcXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0aG9kOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXltZW50IHByb2Nlc3NvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9jZXNzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyLXN1cHBsaWVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHJlYXNvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIGRhdGEgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgdXBkYXRlZCBhdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyBjcmVhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGRlbGV0ZWQgYXQuIEFsd2F5cyBgbnVsbGAgaWYgdGhlIFBheW1lbnQgUHJvZmlsZSBoYXMgbm90IGJlZW4gZGVsZXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50UHJvZmlsZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudFByb2ZpbGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUuICBgUkVBRFlgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyByZWFkeSB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC4gIGBQRU5ESU5HYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaXMgbm90IHJlYWR5IHRvIGJlIHVzZWQuIFlvdeKAmWxsIG5lZWQgdG8gY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkIHRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZS4gIGBSRU1PVkVEYDogVGhpcyBQYXltZW50IFByb2ZpbGUgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRQcm9maWxlU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFJlYWR5ID0gJ1JFQURZJyxcbiAgICBSZW1vdmVkID0gJ1JFTU9WRUQnXG59XG5cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBpbnRlcnZhbCBvZiB0aGUgcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlZHVsZUludGVydmFsIHtcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknXG59XG5cbi8qKlxuICogUGF5bWVudCBzY2hlbWUuIElmIG5vdCBzcGVjaWZpZWQgLSB0aGUgZGVmYXVsdCBpbiB0aGUgcmVnaW9uIHdpbGwgYmUgdXNlZCAoZS5nLiBgU0VQQV9DUkVESVRfVFJBTlNGRVJgIGZvciBFVSkuIFVzaW5nIHVuc3VwcG9ydGVkIHZhbHVlcyB3aWxsIHJlc3VsdCBpbiBhIGZhaWxlZCBwYXltZW50LiAgYExPQ0FMX0RFRkFVTFRgOiBUaGUgZGVmYXVsdCBwYXltZW50IHNjaGVtZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtldCBhbmQgY3VycmVuY3kgd2lsbCBiZSB1c2VkLiAgYExPQ0FMX0lOU1RBTlRgOiBUaGUgaW5zdGFudCBwYXltZW50IHNjaGVtZSBmb3IgdGhlIHNlbGVjdGVkIG1hcmtldCBhbmQgY3VycmVuY3kgd2lsbCBiZSB1c2VkIChpZiBhcHBsaWNhYmxlKS4gRmVlcyBtYXkgYmUgYXBwbGllZCBieSB0aGUgaW5zdGl0dXRpb24uIElmIHRoZSBtYXJrZXQgZG9lcyBub3Qgc3VwcG9ydCBhbiBJbnN0YW50IFNjaGVtZSAoZS5nLiBEZW5tYXJrKSwgdGhlIGRlZmF1bHQgaW4gdGhlIHJlZ2lvbiB3aWxsIGJlIHVzZWQuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJgOiBUaGUgc3RhbmRhcmQgcGF5bWVudCB0byBhIGJlbmVmaWNpYXJ5IHdpdGhpbiB0aGUgU0VQQSBhcmVhLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlRgOiBJbnN0YW50IHBheW1lbnQgd2l0aGluIHRoZSBTRVBBIGFyZWEuIE1heSBpbnZvbHZlIGFkZGl0aW9uYWwgZmVlcyBhbmQgbWF5IG5vdCBiZSBhdmFpbGFibGUgYXQgc29tZSBiYW5rcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRTY2hlbWUge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgTG9jYWxEZWZhdWx0ID0gJ0xPQ0FMX0RFRkFVTFQnLFxuICAgIExvY2FsSW5zdGFudCA9ICdMT0NBTF9JTlNUQU5UJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXIgPSAnU0VQQV9DUkVESVRfVFJBTlNGRVInLFxuICAgIFNlcGFDcmVkaXRUcmFuc2Zlckluc3RhbnQgPSAnU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBBWU1FTlRfU1RBVFVTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgZm9yIHRoZSBwYXltZW50IGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19wYXltZW50X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb2xkX3BheW1lbnRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugd2hlbiBjcmVhdGluZyB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3JlZmVyZW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBzZW50IHRvIHRoZSBiYW5rIGFmdGVyIGFkanVzdG1lbnQgdG8gcGFzcyBiYW5rIHZhbGlkYXRpb24gcnVsZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYHN0YXJ0X2RhdGVgIHByb3ZpZGVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZGluZyBvcmRlci4gSWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIG9yIGlmIHRoZSBwYXltZW50IGlzIG5vdCBhIHN0YW5kaW5nIG9yZGVyLCB0aGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWNjb3VudCBsZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lQWNjb3VudERhdGEge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEluY29tZVJhdGVPZlBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcmF0ZV9vZl9wYXk6IFBheXJvbGxJbmNvbWVSYXRlT2ZQYXk7XG4gICAgLyoqXG4gICAgICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCBhbiBpbmRpdmlkdWFsIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZUFjY291bnREYXRhXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBwYXlyb2xsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSW5jb21lT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcGF5cm9sbCBwcm92aWRlciBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheSBzdHVicyBmb3IgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFBheVN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lT2JqZWN0XG4gICAgICovXG4gICAgcGF5X3N0dWJzOiBBcnJheTxDcmVkaXRQYXlTdHViPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSBXLTJzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRXMj59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICB3MnM6IEFycmF5PENyZWRpdFcyPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiB0YXggZm9ybSAxMDk5cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0MTA5OT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBmb3JtMTA5OXM6IEFycmF5PENyZWRpdDEwOTk+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByYXRlIGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVSYXRlT2ZQYXkge1xuICAgIC8qKlxuICAgICAqIFRoZSByYXRlIGF0IHdoaWNoIGFuIGVtcGxveWVlIGlzIHBhaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICAgICAqL1xuICAgIHBheV9yYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGF0IHdoaWNoIGFuIGVtcGxveWVlIGlzIHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZVJhdGVPZlBheVxuICAgICAqL1xuICAgIHBheV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF5cm9sbCBpdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lOiBBcnJheTxQYXlyb2xsSW5jb21lT2JqZWN0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5cm9sbEl0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXlyb2xsSXRlbVN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSBJdGVtIHdhcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIERlbm90ZXMgdGhlIHByb2Nlc3Npbmcgc3RhdHVzIGZvciB0aGUgdmVyaWZpY2F0aW9uLiAgYFVOS05PV05gOiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICBgUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgYW5kIHRoZSB1c2VyIGhhcyBhcHByb3ZlZCBmb3Igc2hhcmluZy4gVGhlIGRhdGEgaXMgYXZhaWxhYmxlIHRvIGJlIHJldHJpZXZlZC4gIGBQUk9DRVNTSU5HYDogVGhlIHZlcmlmaWNhdGlvbiBpcyBzdGlsbCBwcm9jZXNzaW5nLiBUaGUgZGF0YSBpcyBub3QgYXZhaWxhYmxlIHlldC4gIGBGQUlMRURgOiBUaGUgcHJvY2Vzc2luZyBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LiAgYEFQUFJPVkFMX1NUQVRVU19QRU5ESU5HYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBidXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgYXBwcm92ZWQgdGhlIHNoYXJpbmcgb2YgdGhlIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBwcm9jZXNzaW5nX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBJdGVtIGxpbmtlZCBhcyBwYXJ0IG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsUmlza1NpZ25hbHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGluY29tZSBkb2N1bWVudCBhdXRoZW50aWNpdHkgZGF0YSByZXRyaWV2ZWQgZm9yIGVhY2ggb2YgdGhlIHVzZXJcXCdzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIGVuZCB1c2VyXFwncyBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlZHVjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zOiBEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBkb2NfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgZW1wbG95ZWU6IEVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogUGF5c3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50RGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1wbG95bWVudF9kZXRhaWxzPzogRW1wbG95bWVudERldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIG5ldF9wYXk6IE5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlsczogUGF5UGVyaW9kRGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkRldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheXN0dWJfZGV0YWlscz86IFBheXN0dWJEZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YllURERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHl0ZF9lYXJuaW5ncz86IFBheXN0dWJZVEREZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUxPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdHJlZXQgYWRkcmVzcyBsaW5lIDIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxpbmUyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0ZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVkdWN0aW9uIG9uIHRoZSBwYXlzdHViXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGVkdWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiwgYXMgcHJvdmlkZWQgb24gdGhlIHBheXN0dWIuIEZvciBleGFtcGxlOiBgXFxcIjQwMShrKVxcXCJgLCBgXFxcIkZJQ0EgTUVEIFRBWFxcXCJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgZGVkdWN0aW9uIGlzIHByZS10YXg7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgaXNfcHJldGF4OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRldGFpbHMgdGhhdCBjYW4gYmUgZm91bmQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIEJlZ2lubmluZyBkYXRlIG9mIHRoZSBwYXkgcGVyaW9kIG9uIHRoZSBwYXlzdHViIGluIHRoZSBcXCdZWVlZLU1NLUREXFwnIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9wZXJpb2Rfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRW5kaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9lbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGF5IGRhdGUgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgZ2VuZXJhdGVkIHRoZSBwYXlzdHViLCBlLmcuIEFEUFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5c3R1Yl9wcm92aWRlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheXN0dWJQYXlGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YkVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBkYXRhIGZyb20gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVlPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jb21lX2JyZWFrZG93bj86IEFycmF5PEluY29tZUJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZU5ldFBheX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgbmV0X3BheT86IFBheXN0dWJPdmVycmlkZU5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZGVkdWN0aW9ucz86IFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVhcm5pbmdzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlYXJuaW5ncz86IFBheXN0dWJPdmVycmlkZUVhcm5pbmdzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM/OiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCB0aGUgZGVkdWN0aW9uIGluZm9ybWF0aW9uIGZvdW5kIG9uIGEgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bj86IEFycmF5PFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbD86IFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdG90YWwgZGVkdWN0aW9ucyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSB0b3RhbCBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGFjY291bnRzIHRoYXQgdGhlIHBheW1lbnQgd2FzIGRpc3RyaWJ1dGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGFjY291bnQgZm9yIHRoZSBnaXZlbiBkaXN0cmlidXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayB0aGF0IHRoZSBwYXltZW50IGlzIGJlaW5nIGRlcG9zaXRlZCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBiYW5rX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgZGlzdHJpYnV0ZWQgdG8gdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB0aGUgcGF5c3R1YiB3YXMgc2VudCB0byAoZS5nLiBcXCdjaGVja2luZ1xcJykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCBhIGJyZWFrZG93biBvZiBlYXJuaW5ncyBvbiBhIHBheXN0dWIgYW5kIHRoZSB0b3RhbCBlYXJuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5ncyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NcbiAgICAgKi9cbiAgICBicmVha2Rvd24/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWx9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzXG4gICAgICovXG4gICAgdG90YWw/OiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Vhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb259XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY2Fub25pY2FsX2Rlc2NyaXB0aW9uPzogRWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBob3VycyBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3Vycz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBIb3VybHkgcmF0ZSBhcHBsaWNhYmxlIGZvciB0aGlzIGVhcm5pbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbCB7XG4gICAgLyoqXG4gICAgICogVG90YWwgbnVtYmVyIG9mIGhvdXJzIHdvcmtlZCBmb3IgdGhpcyBwYXkgcGVyaW9kXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBmb3IgdGhlIHRvdGFsIGVhcm5pbmdzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZW1wbG95ZWUgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgc2luZ2xlYCBvciBgbWFycmllZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZVRheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ/OiBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBvZiB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDUgZGlnaXQgcG9zdGFsIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50cnkgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVtcGxveWVyIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3M7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVOZXRQYXlcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheWNoZWNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBjaGVja19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZGlzdHJpYnV0aW9uX2JyZWFrZG93bj86IEFycmF5PFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2QgZW5kIGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgZWFybmluZ3MgYmVmb3JlIHRheC9kZWR1Y3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIHBheXN0dWIgd2FzIGlzc3VlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheV9kYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIHN0YXJ0IGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdDogXFxcInl5eXktbW0tZGRcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRCB7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgZW1wbG95ZWUgaXMgcGFpZC4gUG9zc2libGUgdmFsdWVzOiBgTU9OVEhMWWAsIGBCSS1XRUVLTFlgLCBgV0VFS0xZYCwgYFNFTUktTU9OVEhMWWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlzdHViUGF5RnJlcXVlbmN5IHtcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEJpV2Vla2x5ID0gJ0JJLVdFRUtMWScsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSS1NT05USExZJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGFtb3VudCBvZiBpbmNvbWUgZWFybmVkIHllYXIgdG8gZGF0ZSwgYXMgYmFzZWQgb24gcGF5c3R1YiBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViWVRERGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgZ3Jvc3MgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YllURERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWWVhci10by1kYXRlIG5ldCAodGFrZSBob21lKSBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIG5ldF9lYXJuaW5ncz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBpcyBleHBlY3RlZCB0byBiZSBkaXNjb25uZWN0ZWQuIFRoZSB3ZWJob29rIHdpbGwgY3VycmVudGx5IGJlIGZpcmVkIDcgZGF5cyBiZWZvcmUgdGhlIGV4aXN0aW5nIEl0ZW0gaXMgc2NoZWR1bGVkIGZvciBkaXNjb25uZWN0aW9uLiBUaGlzIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyBbdXBkYXRlIG1vZGVdKGh0dHA6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gQ3VycmVudGx5LCB0aGlzIHdlYmhvb2sgaXMgZmlyZWQgb25seSBmb3IgVVMgb3IgQ2FuYWRpYW4gaW5zdGl0dXRpb25zOyBpbiB0aGUgVUsgb3IgRVUsIHlvdSBzaG91bGQgY29udGludWUgdG8gbGlzdGVkIGZvciB0aGUgW2BQRU5ESU5HX0VYUElSQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jcGVuZGluZ19leHBpcmF0aW9uKSB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBFTkRJTkdfRElTQ09OTkVDVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHJlYXNvbjogUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rUmVhc29uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlYXNvbiB3aHkgdGhlIGl0ZW0gaXMgYWJvdXQgdG8gYmUgZGlzY29ubmVjdGVkLiBgSU5TVElUVVRJT05fTUlHUkFUSU9OYDogVGhlIGluc3RpdHV0aW9uIGlzIG1vdmluZyB0byBBUEkgb3IgdG8gYSBkaWZmZXJlbnQgaW50ZWdyYXRpb24uIEZvciBleGFtcGxlLCB0aGlzIGNhbiBvY2N1ciB3aGVuIGFuIGluc3RpdHV0aW9uIG1vdmVzIGZyb20gYSBub24tT0F1dGggaW50ZWdyYXRpb24gdG8gYW4gT0F1dGggaW50ZWdyYXRpb24uIGBJTlNUSVRVVElPTl9UT0tFTl9FWFBJUkFUSU9OYDogVGhlIGNvbnNlbnQgb24gYW4gSXRlbSBhc3NvY2lhdGVkIHdpdGggYSBVUyBvciBDQSBpbnN0aXR1dGlvbiBpcyBhYm91dCB0byBleHBpcmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tSZWFzb24ge1xuICAgIE1pZ3JhdGlvbiA9ICdJTlNUSVRVVElPTl9NSUdSQVRJT04nLFxuICAgIFRva2VuRXhwaXJhdGlvbiA9ICdJTlNUSVRVVElPTl9UT0tFTl9FWFBJUkFUSU9OJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbeKAmXMgYWNjZXNzIGNvbnNlbnQgaXMgZXhwaXJpbmcgaW4gNyBkYXlzLiBUaGlzIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyB1cGRhdGUgbW9kZS4gVGhpcyB3ZWJob29rIGlzIGZpcmVkIG9ubHkgZm9yIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBpbnN0aXR1dGlvbnMgaW4gRXVyb3BlIChpbmNsdWRpbmcgdGhlIFVLKTsgZm9yIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBpbnN0aXR1dGlvbnMgaW4gdGhlIFVTIG9yIENhbmFkYSwgc2VlIFtgUEVORElOR19ESVNDT05ORUNUYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3BlbmRpbmdfZGlzY29ubmVjdCkgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19FWFBJUkFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIEl0ZW1cXCdzIGFjY2VzcyBjb25zZW50IHdpbGwgZXhwaXJlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgY29uc2VudF9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBwZXJzb25hbCBmaW5hbmNlIHVzZSBjYXNlcywgYnV0IG5vdCBsaW1pdGVkIHRvIHN1Y2ggdXNlIGNhc2VzLiAgU2VlIHRoZSBbYHRheG9ub215IENTViBmaWxlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcy4gSWYgeW91IGFyZSBtaWdyYXRpbmcgdG8gcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGZyb20gdGhlIGxlZ2FjeSBjYXRlZ29yaWVzLCBhbHNvIHJlZmVyIHRvIHRoZSBbYG1pZ3JhdGlvbiBndWlkZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3BmYy1taWdyYXRpb24vKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB7XG4gICAgLyoqXG4gICAgICogQSBoaWdoIGxldmVsIGNhdGVnb3J5IHRoYXQgY29tbXVuaWNhdGVzIHRoZSBicm9hZCBjYXRlZ29yeSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBncmFudWxhciBjYXRlZ29yeSBjb252ZXlpbmcgdGhlIHRyYW5zYWN0aW9uXFwncyBpbnRlbnQuIFRoaXMgZmllbGQgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBkZXRhaWxlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gb2YgaG93IGNvbmZpZGVudCB3ZSBhcmUgdGhhdCB0aGUgcHJvdmlkZWQgY2F0ZWdvcmllcyBhY2N1cmF0ZWx5IGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbiBpbnRlbnQuICBgVkVSWV9ISUdIYDogV2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSBhcmUgbW9yZSB0aGFuIDkwJSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgTUVESVVNYDogV2UgYXJlIG1vZGVyYXRlbHkgY29uZmlkZW50IHRoYXQgdGhpcyBjYXRlZ29yeSByZWZsZWN0cyB0aGUgaW50ZW50IG9mIHRoZSB0cmFuc2FjdGlvbi4gYExPV2A6IFRoaXMgY2F0ZWdvcnkgbWF5IHJlZmxlY3QgdGhlIGludGVudCwgYnV0IHRoZXJlIG1heSBiZSBvdGhlciBjYXRlZ29yaWVzIHRoYXQgYXJlIG1vcmUgYWNjdXJhdGUuIGBVTktOT1dOYDogV2UgZG9u4oCZdCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNhdGVnb3J5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcGhvbmUgbnVtYmVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBob25lTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICBkYXRhOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHBob25lIG51bWJlciBhcyB0aGUgcHJpbWFyeSBudW1iZXIgb24gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJcbiAgICAgKi9cbiAgICBwcmltYXJ5OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IFBob25lTnVtYmVyVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUGhvbmVOdW1iZXJUeXBlRW51bSB7XG4gICAgSG9tZSA9ICdob21lJyxcbiAgICBXb3JrID0gJ3dvcmsnLFxuICAgIE9mZmljZSA9ICdvZmZpY2UnLFxuICAgIE1vYmlsZSA9ICdtb2JpbGUnLFxuICAgIE1vYmlsZTEgPSAnbW9iaWxlMScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogU2NvcmUgZm91bmQgYnkgbWF0Y2hpbmcgcGhvbmUgbnVtYmVyIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgcGhvbmUgbnVtYmVyIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2ggYW5kIDAgaXMgYSBubyBtYXRjaC4gSWYgdGhlIGFjY291bnQgY29udGFpbnMgbXVsdGlwbGUgb3duZXJzLCB0aGUgbWF4aW11bSBtYXRjaCBzY29yZSBpcyBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBob25lTnVtYmVyTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBob25lTnVtYmVyTWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogTWF0Y2ggc2NvcmUgZm9yIG5vcm1hbGl6ZWQgcGhvbmUgbnVtYmVyLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoLCA5OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2ggKG1hdGNoaW5nIHRoZSBzYW1lIHBob25lIG51bWJlciB3aXRoIGV4dGVuc2lvbiBhZ2FpbnN0IG9uZSB3aXRob3V0IGV4dGVuc2lvbiwgZXRjLiksIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBwaG9uZSBudW1iZXIgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBwaG9uZSBudW1iZXIgaXMgYSBwaG9uZSBsaW5lIG9yIGEgZmF4IGxpbmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQaG9uZVR5cGUge1xuICAgIFBob25lID0gJ3Bob25lJyxcbiAgICBGYXggPSAnZmF4J1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGlkZW50aXR5IGRvY3VtZW50IGRldGVjdGVkIGluIHRoZSBpbWFnZXMgcHJvdmlkZWQuIFdpbGwgYWx3YXlzIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICAgYGRyaXZlcnNfbGljZW5zZWAgLSBBIGRyaXZlclxcJ3MgbGljZW5zZSBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSwgZXN0YWJsaXNoaW5nIGlkZW50aXR5IHdpdGhvdXQgYW55IGd1YXJhbnRlZSBhcyB0byBjaXRpemVuc2hpcCwgYW5kIGdyYW50aW5nIGRyaXZpbmcgcHJpdmlsZWdlcyAgICBgaWRfY2FyZGAgLSBBIGdlbmVyYWwgbmF0aW9uYWwgaWRlbnRpZmljYXRpb24gY2FyZCwgZGlzdGluY3QgZnJvbSBkcml2ZXJcXCdzIGxpY2Vuc2VzIGFzIGl0IG9ubHkgZXN0YWJsaXNoZXMgaWRlbnRpdHkgICAgYHBhc3Nwb3J0YCAtIEEgdHJhdmVsIHBhc3Nwb3J0IGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5IGZvciBvbmUgb2YgaXRzIGNpdGl6ZW5zICAgIGByZXNpZGVuY2VfcGVybWl0X2NhcmRgIC0gQW4gaWRlbnRpdHkgZG9jdW1lbnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgcGVybWl0dGluZyBhIGZvcmVpZ24gY2l0aXplbiB0byA8ZW0+dGVtcG9yYXJpbHk8L2VtPiByZXNpZGUgdGhlcmUgICAgYHJlc2lkZW50X2NhcmRgIC0gQW4gaWRlbnRpdHkgZG9jdW1lbnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgcGVybWl0dGluZyBhIGZvcmVpZ24gY2l0aXplbiB0byA8ZW0+cGVybWFuZW50bHk8L2VtPiByZXNpZGUgdGhlcmUgICAgYHZpc2FgIC0gQW4gaWRlbnRpdHkgZG9jdW1lbnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgcGVybWl0dGluZyBhIGZvcmVpZ24gY2l0aXplbiBlbnRyeSBmb3IgYSBzaG9ydCBkdXJhdGlvbiBhbmQgZm9yIGEgc3BlY2lmaWMgcHVycG9zZSwgdHlwaWNhbGx5IG5vIGxvbmdlciB0aGFuIDYgbW9udGhzICBOb3RlOiBUaGlzIHZhbHVlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgSUQgdHlwZSB0aGF0IHRoZSB1c2VyIHNlbGVjdHMgd2l0aGluIExpbmsuIEZvciBleGFtcGxlLCBpZiB0aGV5IHNlbGVjdCBcXFwiRHJpdmVyXFwncyBMaWNlbnNlXFxcIiBidXQgdGhlbiBzdWJtaXQgYSBwaWN0dXJlIG9mIGEgcGFzc3BvcnQsIHRoaXMgZmllbGQgd2lsbCBzYXkgYHBhc3Nwb3J0YFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGh5c2ljYWxEb2N1bWVudENhdGVnb3J5IHtcbiAgICBEcml2ZXJzTGljZW5zZSA9ICdkcml2ZXJzX2xpY2Vuc2UnLFxuICAgIElkQ2FyZCA9ICdpZF9jYXJkJyxcbiAgICBQYXNzcG9ydCA9ICdwYXNzcG9ydCcsXG4gICAgUmVzaWRlbmNlUGVybWl0Q2FyZCA9ICdyZXNpZGVuY2VfcGVybWl0X2NhcmQnLFxuICAgIFJlc2lkZW50Q2FyZCA9ICdyZXNpZGVudF9jYXJkJyxcbiAgICBWaXNhID0gJ3Zpc2EnXG59XG5cbi8qKlxuICogRGF0YSBleHRyYWN0ZWQgZnJvbSBhIHVzZXItc3VibWl0dGVkIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhIHtcbiAgICAvKipcbiAgICAgKiBBbHBoYS1udW1lcmljIElEIG51bWJlciBleHRyYWN0ZWQgdmlhIE9DUiBmcm9tIHRoZSB1c2VyXFwncyBkb2N1bWVudCBpbWFnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnk7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBpc3N1aW5nX2NvdW50cnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2UgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogQW5hbHlzaXMgb2YgdGhlIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHN1Ym1pdHRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudE5hbWVNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBEb2N1bWVudE5hbWVNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50RGF0ZU9mQmlydGhNYXRjaENvZGV9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBEb2N1bWVudERhdGVPZkJpcnRoTWF0Y2hDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHBpcmF0aW9uRGF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogRXhwaXJhdGlvbkRhdGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lzc3VpbmdDb3VudHJ5fVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgaXNzdWluZ19jb3VudHJ5OiBJc3N1aW5nQ291bnRyeTtcbn1cbi8qKlxuICogVVJMcyBmb3IgZG93bmxvYWRpbmcgb3JpZ2luYWwgYW5kIGNyb3BwZWQgaW1hZ2VzIGZvciB0aGlzIGRvY3VtZW50IHN1Ym1pc3Npb24uIFRoZSBVUkxzIGFyZSBkZXNpZ25lZCB0byBvbmx5IGFsbG93IGRvd25sb2FkaW5nLCBub3QgaG90IGxpbmtpbmcsIHNvIHRoZSBVUkwgd2lsbCBvbmx5IHNlcnZlIHRoZSBkb2N1bWVudCBpbWFnZSBmb3IgNjAgc2Vjb25kcyBiZWZvcmUgZXhwaXJpbmcuIFRoZSBleHBpcmF0aW9uIHRpbWUgaXMgNjAgc2Vjb25kcyBhZnRlciB0aGUgYEdFVGAgcmVxdWVzdCBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuIEEgbmV3IGV4cGlyaW5nIFVSTCBpcyBnZW5lcmF0ZWQgd2l0aCBlYWNoIHJlcXVlc3QsIHNvIHlvdSBjYW4gYWx3YXlzIHJlcmVxdWVzdCB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgaWYgb25lIG9mIHlvdXIgVVJMcyBleHBpcmVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEltYWdlcyB7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgdGhlIHVuY3JvcHBlZCBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgZnJvbnQgb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9mcm9udDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyB0aGUgb3JpZ2luYWwgaW1hZ2Ugb2YgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50LiBNaWdodCBiZSBudWxsIGlmIHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudCB3YXMgbm90IGNvbGxlY3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgb3JpZ2luYWxfYmFjazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3BwZWQgaW1hZ2UgY29udGFpbmluZyBqdXN0IHRoZSBmcm9udCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGNyb3BwZWRfZnJvbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wcGVkIGltYWdlIGNvbnRhaW5pbmcganVzdCB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50IHdhcyBub3QgY29sbGVjdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBjcm9wcGVkX2JhY2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCB0aGF0IGV4cGlyZXMgYWZ0ZXIgNjAgc2Vjb25kcyBmb3IgZG93bmxvYWRpbmcgYSBjcm9wIG9mIGp1c3QgdGhlIHVzZXJcXCdzIGZhY2UgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gYSBmYWNlIHBob3RvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBmYWNlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0cyBvZiB0aGUgUGxhaWQgQ2hlY2sgc2NvcmVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRDaGVja1Njb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhaWRDaGVja1Njb3JlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIENoZWNrIFNjb3JlIG1vZGVsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQ2hlY2tTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29ucyBmb3IgYW4gaW5kaXZpZHVhbCBoYXZpbmcgcmlzayBhY2NvcmRpbmcgdG8gdGhlIFBsYWlkIENoZWNrIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZENoZWNrU2NvcmVcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgUGxhaWQgQ2hlY2sgc2NvcmUgY291bGQgbm90IGJlIGNvbXB1dGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQ2hlY2tTY29yZVxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEVycm9ycyBhcmUgaWRlbnRpZmllZCBieSBgZXJyb3JfY29kZWAgYW5kIGNhdGVnb3JpemVkIGJ5IGBlcnJvcl90eXBlYC4gVXNlIHRoZXNlIGluIHByZWZlcmVuY2UgdG8gSFRUUCBzdGF0dXMgY29kZXMgdG8gaWRlbnRpZnkgYW5kIGhhbmRsZSBzcGVjaWZpYyBlcnJvcnMuIEhUVFAgc3RhdHVzIGNvZGVzIGFyZSBzZXQgYW5kIHByb3ZpZGUgdGhlIGJyb2FkZXN0IGNhdGVnb3JpemF0aW9uIG9mIGVycm9yczogNHh4IGNvZGVzIGFyZSBmb3IgZGV2ZWxvcGVyLSBvciB1c2VyLXJlbGF0ZWQgZXJyb3JzLCBhbmQgNXh4IGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBlcnJvcnMsIGFuZCB0aGUgc3RhdHVzIHdpbGwgYmUgMnh4IGluIG5vbi1lcnJvciBjYXNlcy4gQW4gSXRlbSB3aXRoIGEgbm9uLWBudWxsYCBlcnJvciBvYmplY3Qgd2lsbCBvbmx5IGJlIHBhcnQgb2YgYW4gQVBJIHJlc3BvbnNlIHdoZW4gY2FsbGluZyBgL2l0ZW0vZ2V0YCB0byB2aWV3IEl0ZW0gc3RhdHVzLiBPdGhlcndpc2UsIGVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQ7IGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZCwgYW4gZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBsYWlkRXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFpZEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBQbGFpZEVycm9yVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydGljdWxhciBlcnJvciBjb2RlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIHJlYXNvbiBmb3IgdGhlIGVycm9yIGNvZGUuIEN1cnJlbnRseSwgcmVhc29ucyBhcmUgb25seSBzdXBwb3J0ZWQgT0F1dGgtYmFzZWQgaXRlbSBlcnJvcnM7IGBudWxsYCB3aWxsIGJlIHJldHVybmVkIG90aGVyd2lzZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gIFBvc3NpYmxlIHZhbHVlczogYE9BVVRIX0lOVkFMSURfVE9LRU5gOiBUaGUgdXNlcuKAmXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGhhcyBiZWVuIGludmFsaWRhdGVkLiAgYE9BVVRIX0NPTlNFTlRfRVhQSVJFRGA6IFRoZSB1c2VyXFwncyBhY2Nlc3MgY29uc2VudCBmb3IgdGhpcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGV4cGlyZWQuICBgT0FVVEhfVVNFUl9SRVZPS0VEYDogVGhlIHVzZXLigJlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBpcyBpbnZhbGlkIGJlY2F1c2UgdGhlIHVzZXIgcmV2b2tlZCB0aGVpciBjb25uZWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBgbnVsbGAgaWYgdGhlIGVycm9yIGlzIG5vdCByZWxhdGVkIHRvIHVzZXIgYWN0aW9uLiAgVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGRpc3BsYXlfbWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVxdWVzdCwgdG8gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nIHB1cnBvc2VzLiBUaGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZCBpbiBlcnJvcnMgcHJvdmlkZWQgYnkgd2ViaG9va3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhpcyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGNhdXNlcz86IEFycmF5PGFueT47XG4gICAgLyoqXG4gICAgICogVGhlIEhUVFAgc3RhdHVzIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvci4gVGhpcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgd2hlbiB0aGUgZXJyb3IgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgdmlhIGEgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3RhdHVzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgUGxhaWQgZG9jdW1lbnRhdGlvbiBwYWdlIHdpdGggbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIHN1Z2dlc3RlZF9hY3Rpb24/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBsYWlkRXJyb3JUeXBlIHtcbiAgICBJbnZhbGlkUmVxdWVzdCA9ICdJTlZBTElEX1JFUVVFU1QnLFxuICAgIEludmFsaWRSZXN1bHQgPSAnSU5WQUxJRF9SRVNVTFQnLFxuICAgIEludmFsaWRJbnB1dCA9ICdJTlZBTElEX0lOUFVUJyxcbiAgICBJbnN0aXR1dGlvbkVycm9yID0gJ0lOU1RJVFVUSU9OX0VSUk9SJyxcbiAgICBSYXRlTGltaXRFeGNlZWRlZCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICBBcGlFcnJvciA9ICdBUElfRVJST1InLFxuICAgIEl0ZW1FcnJvciA9ICdJVEVNX0VSUk9SJyxcbiAgICBBc3NldFJlcG9ydEVycm9yID0gJ0FTU0VUX1JFUE9SVF9FUlJPUicsXG4gICAgUmVjYXB0Y2hhRXJyb3IgPSAnUkVDQVBUQ0hBX0VSUk9SJyxcbiAgICBPYXV0aEVycm9yID0gJ09BVVRIX0VSUk9SJyxcbiAgICBQYXltZW50RXJyb3IgPSAnUEFZTUVOVF9FUlJPUicsXG4gICAgQmFua1RyYW5zZmVyRXJyb3IgPSAnQkFOS19UUkFOU0ZFUl9FUlJPUicsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uRXJyb3IgPSAnSU5DT01FX1ZFUklGSUNBVElPTl9FUlJPUicsXG4gICAgTWljcm9kZXBvc2l0c0Vycm9yID0gJ01JQ1JPREVQT1NJVFNfRVJST1InLFxuICAgIFNhbmRib3hFcnJvciA9ICdTQU5EQk9YX0VSUk9SJyxcbiAgICBQYXJ0bmVyRXJyb3IgPSAnUEFSVE5FUl9FUlJPUicsXG4gICAgVHJhbnNhY3Rpb25zRXJyb3IgPSAnVFJBTlNBQ1RJT05TX0VSUk9SJyxcbiAgICBUcmFuc2FjdGlvbkVycm9yID0gJ1RSQU5TQUNUSU9OX0VSUk9SJyxcbiAgICBUcmFuc2ZlckVycm9yID0gJ1RSQU5TRkVSX0VSUk9SJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGEgc2V0IG9mIGlkcyByZWxhdGVkIHRvIGFuIGVtcGxveWVlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBsYXRmb3JtSWRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1JZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhbiBlbXBsb3llZSBhcyBnaXZlbiBieSB0aGVpciBlbXBsb3llclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgZW1wbG95ZWVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhbiBlbXBsb3llZSBhcyBnaXZlbiBieSB0aGVpciBwYXlyb2xsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbXBsb3llZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcG9zaXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGF0YSBmcm9tIHRoZSBDYXNoU2NvcmXCriBwcm9kdWN0IHJldHVybmVkIGJ5IFByaXNtIERhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtQ2FzaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGNhc2ggc2NvcmUgbW9kZWwgdXNlZC4gVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBtb2RlbF92ZXJzaW9uYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGNhc2ggc2NvcmUgbW9kZWwgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgY2FzaCBzY29yZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUNhc2hTY29yZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogUHJpc21DYXNoU2NvcmVNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgcmV0dXJuZWQgYnkgUHJpc20gZm9yIHRoaXMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVkIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWluX2FnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IGNyZWRpdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWluX2FnZV9jcmVkaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGxhdGVzdCBkZWJpdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWluX2FnZV9kZWJpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgb2xkZXN0IGRlYml0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXhfYWdlX2RlYml0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgY3JlZGl0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXhfYWdlX2NyZWRpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbnVtX3RyeG5fY3JlZGl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkZWJpdCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG51bV90cnhuX2RlYml0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDMwIGRheXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIGwxbV9jcmVkaXRfdmFsdWVfY250OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbDFtX2RlYml0X3ZhbHVlX2NudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gQ2FzaFNjb3JlLiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGRlZmF1bHQgdG8gdjMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbUNhc2hTY29yZVZlcnNpb24ge1xuICAgIF8zTGl0ZSA9ICczX2xpdGUnLFxuICAgIF8zID0gJzMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgZGF0YSBmcm9tIHRoZSBGaXJzdERldGVjdCBwcm9kdWN0IHJldHVybmVkIGJ5IFByaXNtIERhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtRmlyc3REZXRlY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUZpcnN0RGV0ZWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBGaXJzdERldGVjdCBtb2RlbCB1c2VkLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYG1vZGVsX3ZlcnNpb25gLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBEYXRhXFwncyBGaXJzdERldGVjdCBtb2RlbCB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBtb2RlbF92ZXJzaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSBQcmlzbSBEYXRhLiBSYW5nZXMgZnJvbSAxLTk5OSwgd2l0aCBoaWdoZXIgc2NvcmUgaW5kaWNhdGluZyBsb3dlciByaXNrLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBzY29yZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgRmlyc3REZXRlY3Qgc2NvcmUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICByZWFzb25fY29kZXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbUNhc2hTY29yZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUZpcnN0RGV0ZWN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBlcnJvcl9yZWFzb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIEZpcnN0RGV0ZWN0LiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGRlZmF1bHQgdG8gdjMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbUZpcnN0RGV0ZWN0VmVyc2lvbiB7XG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIEluc2lnaHRzIHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIGluc2lnaHRzIG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21JbnNpZ2h0c1xuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSW5zaWdodHMgUmVzdWx0IG9iamVjdCBpcyBhIG1hcCBvZiBjYXNoIGZsb3cgYXR0cmlidXRlcywgd2hlcmUgdGhlIGtleSBpcyBhIHN0cmluZywgYW5kIHRoZSB2YWx1ZSBpcyBhIGZsb2F0IG9yIHN0cmluZy5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUluc2lnaHRzXG4gICAgICovXG4gICAgcmVzdWx0Pzogb2JqZWN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtSW5zaWdodHNcbiAgICAgKi9cbiAgICBlcnJvcl9yZWFzb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIEluc2lnaHRzLiBJZiBub3Qgc3BlY2lmaWVkLCB3aWxsIGRlZmF1bHQgdG8gdjMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbUluc2lnaHRzVmVyc2lvbiB7XG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBQcmlzbSBwcm9kdWN0cyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcmlzbVByb2R1Y3Qge1xuICAgIEluc2lnaHRzID0gJ2luc2lnaHRzJyxcbiAgICBTY29yZXMgPSAnc2NvcmVzJ1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9ucyBvZiBQcmlzbSBwcm9kdWN0cyB0byBldmFsdWF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbVZlcnNpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21WZXJzaW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtRmlyc3REZXRlY3RWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zXG4gICAgICovXG4gICAgZmlyc3RkZXRlY3Q/OiBQcmlzbUZpcnN0RGV0ZWN0VmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21WZXJzaW9uc1xuICAgICAqL1xuICAgIGNhc2hzY29yZT86IFByaXNtQ2FzaFNjb3JlVmVyc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHNWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzVmVyc2lvbiB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hY2NvdW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgdmFsdWUgb2J0YWluZWQgZnJvbSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgaW4gTGlua1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3Nvck51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogUHJvY2Vzc29yTnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG59XG4vKipcbiAqIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBvbGRlc3QgYWNjZXB0YWJsZSBiYWxhbmNlIHdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFRoaXMgZmllbGQgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSksICphbmQqIG9uZSBvciBtb3JlIGFjY291bnQgdHlwZXMgYmVpbmcgcmVxdWVzdGVkIGlzIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCAoc3VjaCBhcyBhIGNyZWRpdCBjYXJkKSBhcyBDYXBpdGFsIE9uZSBkb2VzIG5vdCBwcm92aWRlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gSW4gdGhpcyBjYXNlLCBhIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgb3IgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgSU5WQUxJRF9GSUVMRGAgd2lsbCBiZSByZXR1cm5lZC4gRm9yIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIGFzIHdlbGwgYXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMgYXQgQ2FwaXRhbCBPbmUgKGluY2x1ZGluZyBhbGwgY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMpIHRoaXMgZmllbGQgaXMgaWdub3JlZCBhbmQgcmVhbC10aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24gd2lsbCBiZSBmZXRjaGVkLiAgSWYgdGhpcyBmaWVsZCBpcyBub3QgaWdub3JlZCwgYW5kIG5vIGFjY2VwdGFibGUgYmFsYW5jZSBpcyBhdmFpbGFibGUsIGFuIGBJTlZBTElEX1JFU1VMVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBiYW5rIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgYmFuayB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBiYW5rIHRyYW5zZmVyIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlOiBCYW5rVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBiYW5rIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50IOKAkyBzaG91bGQgYmUgc2V0IHRvIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogQmFua1RyYW5zZmVyVXNlcjtcbiAgICAvKipcbiAgICAgKiBBbiBhcmJpdHJhcnkgc3RyaW5nIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZm9yIHN0b3JhZ2Ugd2l0aCB0aGUgYmFuayB0cmFuc2Zlci4gTWF5IGJlIHVwIHRvIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXN0b21fdGFnPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb24gZGF0YSBpcyBhdmFpbGFibGUgZm9yIGFuIEl0ZW0uIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgZGV0ZWN0ZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzIHdlYmhvb2sgd2FzIGZpcmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIHB1bGwgaXMgY29tcGxldGVkIGFuZCBQbGFpZCBoYXMgcHJlcGFyZWQgYXMgbXVjaCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIGRhdGEgYXMgcG9zc2libGUgZm9yIHRoZSBJdGVtLiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgYmVlbiBmaXJlZCwgdHJhbnNhY3Rpb24gZGF0YSBiZXlvbmQgdGhlIG1vc3QgcmVjZW50IDMwIGRheXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtLiBUaGlzIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGlmIGFjY291bnQgc2VsZWN0aW9ucyBmb3IgdGhlIEl0ZW0gYXJlIHVwZGF0ZWQsIHdpdGggYG5ld190cmFuc2FjdGlvbnNgIHNldCB0byB0aGUgbnVtYmVyIG9mIG5ldCBuZXcgdHJhbnNhY3Rpb25zIHB1bGxlZCBhZnRlciB0aGUgYWNjb3VudCBzZWxlY3Rpb24gdXBkYXRlLiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50SWRlbnRpdHk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eU1hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGluaXRpYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQuIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pbnZlc21lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBob2xkaW5ncyBiZWxvbmdpbmcgdG8gaW52ZXN0bWVudCBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIERldGFpbHMgb2YgdGhlIHNlY3VyaXRpZXMgaW4gdGhlIGhvbGRpbmdzIGFyZSBwcm92aWRlZCBpbiB0aGUgYHNlY3VyaXRpZXNgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SG9sZGluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIEludmVzdG1lbnRzIHRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEFsbCBzZWN1cml0aWVzIGZvciB3aGljaCB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgdHJhbnNhY3Rpb24gYmVpbmcgZmV0Y2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VjdXJpdGllczogQXJyYXk8U2VjdXJpdHk+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgSXRlbVxcJ3MgcG9ydGZvbGlvIHdhcyBtYW51YWxseSBjcmVhdGVkIHdpdGggdGhlIEludmVzdG1lbnRzIEZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudGAuIFRoZSBpZGVudGlmeWluZyBudW1iZXIgdHlwZSAoQUNILCBFRlQsIElCQU4sIG9yIEJBQ1MpIHVzZWQgd2lsbCBkZXBlbmQgb24gdGhlIGNvdW50cnkgb2YgdGhlIGFjY291bnQuIEFuIGFjY291bnQgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBudW1iZXIgdHlwZS4gSWYgYSBwYXJ0aWN1bGFyIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIGlzIG5vdCB1c2VkIGJ5IHRoZSBgYWNjb3VudGAgZm9yIHdoaWNoIGF1dGggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIGEgbnVsbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JOdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQUNITnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGFjaD86IE51bWJlcnNBQ0hOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNFRlROdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgZWZ0PzogTnVtYmVyc0VGVE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgaW50ZXJuYXRpb25hbD86IE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBiYWNzPzogTnVtYmVyc0JBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGRhdGEgaXMgdXBkYXRlZC4gVGhpcyBpbmNsdWRlcyB3aGVuIGEgbmV3IHJlY3VycmluZyBzdHJlYW0gaXMgZGV0ZWN0ZWQgb3Igd2hlbiBhIG5ldyB0cmFuc2FjdGlvbiBpcyBhZGRlZCB0byBhbiBleGlzdGluZyByZWN1cnJpbmcgc3RyZWFtLiBUaGUgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYCB3ZWJob29rIHdpbGwgYWxzbyBmaXJlIHdoZW4gb25lIG9yIG1vcmUgYXR0cmlidXRlcyBvZiB0aGUgcmVjdXJyaW5nIHN0cmVhbSBjaGFuZ2VzLCB3aGljaCBpcyB1c3VhbGx5IGEgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbiwgdXBkYXRlLCBvciByZW1vdmFsIG9mIHRyYW5zYWN0aW9ucyB0byB0aGUgc3RyZWFtLiAgQWZ0ZXIgcmVjZWlwdCBvZiB0aGlzIHdlYmhvb2ssIHRoZSB1cGRhdGVkIGRhdGEgY2FuIGJlIGZldGNoZWQgZnJvbSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWF0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFjdHVhbCBudW1iZXIgb2YgZGF5cyAoaG9sZCB0aW1lKSBzaW5jZSB0aGUgQUNIIGRlYml0IHRyYW5zYWN0aW9uIHRoYXQgeW91IHdhaXQgYmVmb3JlIG1ha2luZyBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMuIFRoZSBob2xkaW5nIHRpbWUgY291bGQgYWZmZWN0IHRoZSBBQ0ggcmV0dXJuIHJhdGUuICBGb3IgZXhhbXBsZSwgdXNlIDAgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBvciB0aGUgc2FtZSBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbiwgb3IgMSBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdGhlIG5leHQgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19mdW5kc19vbl9ob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGVjaXNpb25PdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9vdXRjb21lPzogU2lnbmFsRGVjaXNpb25PdXRjb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGF5bWVudE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q/OiBTaWduYWxQYXltZW50TWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IChpbiBVU0QpIG1hZGUgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLiBJdCBjb3VsZCBiZSBhIHBhcnRpYWwgYW1vdW50IG9mIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24gKGV4YW1wbGU6IDEwMi4wNSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50X2luc3RhbnRseV9hdmFpbGFibGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBlbmQgdXNlciBpcyBwcmVzZW50IHdoaWxlIGluaXRpYXRpbmcgdGhlIEFDSCB0cmFuc2ZlciBhbmQgdGhlIGVuZHBvaW50IGlzIGJlaW5nIGNhbGxlZDsgYGZhbHNlYCBvdGhlcndpc2UgKGZvciBleGFtcGxlLCB3aGVuIHRoZSBBQ0ggdHJhbnNmZXIgaXMgc2NoZWR1bGVkIGFuZCB0aGUgZW5kIHVzZXIgaXMgbm90IHByZXNlbnQsIG9yIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgdGhlIEFDSCB0cmFuc2ZlciBidXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIE5hY2hhIGZpbGUgZm9yIEFDSCBwcm9jZXNzaW5nKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBJdGVtcy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiAqKnRydWUqKiBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGlzIGEgcmVjdXJyaW5nIHRyYW5zYWN0aW9uOyAqKmZhbHNlKiogb3RoZXJ3aXNlIFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19yZWN1cnJpbmc/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBBQ0ggb3Igbm9uLUFDSCBwYXltZW50IG1ldGhvZCB0byBjb21wbGV0ZSB0aGUgdHJhbnNhY3Rpb24uIGBTQU1FX0RBWV9BQ0hgOiBTYW1lIERheSBBQ0ggYnkgTkFDSEEuIFRoZSBkZWJpdCB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgb24gdGhlIHNhbWUgZGF5IGBORVhUX0RBWV9BQ0hgOiBOZXh0IERheSBBQ0ggc2V0dGxlbWVudCBmb3IgZGViaXQgdHJhbnNhY3Rpb25zLCBvZmZlcmVkIGJ5IHNvbWUgcGF5bWVudCBwcm9jZXNzb3JzIGBTVEFOREFSRF9BQ0hgOiBzdGFuZGFyZCBBQ0ggYnkgTkFDSEEgYFJFQUxfVElNRV9QQVlNRU5UU2A6IHJlYWwtdGltZSBwYXltZW50cyBzdWNoIGFzIFJUUCBhbmQgRmVkTm93IGBERUJJVF9DQVJEYDogaWYgdGhlIGRlZmF1bHQgcGF5bWVudCBpcyBvdmVyIGRlYml0IGNhcmQgbmV0d29ya3MgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciB0aGVyZSBhcmUgbXVsdGlwbGUgcGF5bWVudCBtZXRob2RzIFBvc3NpYmxlIHZhbHVlczogIGBTQU1FX0RBWV9BQ0hgLCBgTkVYVF9EQVlfQUNIYCwgYFNUQU5EQVJEX0FDSGAsIGBSRUFMX1RJTUVfUEFZTUVOVFNgLCBgREVCSVRfQ0FSRGAsIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVmYXVsdF9wYXltZW50X21ldGhvZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBTaWduYWxVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFNpZ25hbERldmljZTtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBSdWxlc2V0IHRvIHVzZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBSdWxlc2V0IHVzaW5nIHRoZSBTaWduYWwgZGFzaGJvYXJkIGxvY2F0ZWQgd2l0aGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIElmIG5vdCBwcm92aWRlZCwgbm8gUnVsZXNldCB3aWxsIGJlIHVzZWQuIFRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgaW4gY2xvc2VkIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY29yZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29yZXM6IFNpZ25hbFNjb3JlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSdWxlc2V0fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZXNldD86IFJ1bGVzZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByZXR1cm4gY29kZSAoZS5nLiBcXFwiUjAxXFxcIikgIElmIGZvcm1hdHRlZCBpbmNvcnJlY3RseSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBbYElOVkFMSURfRklFTERgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1yZXF1ZXN0LyNpbnZhbGlkX2ZpZWxkKSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4geW91IHJlY2VpdmUgdGhlIHJldHVybnMgZnJvbSB5b3VyIHBheW1lbnQgcHJvY2Vzc29ycywgaW4gSVNPIDg2MDEgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcmV0dXJuZWRfYXQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2VudCB0byBTdHJpcGUgZm9yIHVzZSBpbiBtYWtpbmcgQVBJIGNhbGxzIHRvIFBsYWlkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RyaXBlX2JhbmtfYWNjb3VudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB0aGUgb2xkZXIgd2ViaG9va3MgYElOSVRJQUxfVVBEQVRFYCwgYEhJU1RPUklDQUxfVVBEQVRFYCwgYERFRkFVTFRfVVBEQVRFYCwgYW5kIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGAsIHdoaWNoIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIG5ldyBjaGFuZ2VzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbSBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0byByZWNlaXZlIHRoaXMgd2ViaG9vayBmb3IgYW4gSXRlbSwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIHRyYW5zYWN0aW9ucyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbml0aWFsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpbml0aWFsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaGlzdG9yaWNhbCBwdWxsIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgeW91IGFyZSBpbnRlZ3JhdGluZyB3aXRoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0UHJvY2Vzc29yRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtIHtcbiAgICBEd29sbGEgPSAnZHdvbGxhJyxcbiAgICBHYWxpbGVvID0gJ2dhbGlsZW8nLFxuICAgIE1vZGVyblRyZWFzdXJ5ID0gJ21vZGVybl90cmVhc3VyeScsXG4gICAgT2Nyb2x1cyA9ICdvY3JvbHVzJyxcbiAgICBWZXN0YSA9ICd2ZXN0YScsXG4gICAgRHJpdmV3ZWFsdGggPSAnZHJpdmV3ZWFsdGgnLFxuICAgIFZvcGF5ID0gJ3ZvcGF5JyxcbiAgICBBY2hxID0gJ2FjaHEnLFxuICAgIENoZWNrID0gJ2NoZWNrJyxcbiAgICBDaGVja2Jvb2sgPSAnY2hlY2tib29rJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaWxhTW9uZXkgPSAnc2lsYV9tb25leScsXG4gICAgUml6ZSA9ICdyaXplJyxcbiAgICBTdmJBcGkgPSAnc3ZiX2FwaScsXG4gICAgVW5pdCA9ICd1bml0JyxcbiAgICBXeXJlID0gJ3d5cmUnLFxuICAgIExpdGhpYyA9ICdsaXRoaWMnLFxuICAgIEFscGFjYSA9ICdhbHBhY2EnLFxuICAgIEFzdHJhID0gJ2FzdHJhJyxcbiAgICBNb292ID0gJ21vb3YnLFxuICAgIFRyZWFzdXJ5UHJpbWUgPSAndHJlYXN1cnlfcHJpbWUnLFxuICAgIE1hcnFldGEgPSAnbWFycWV0YScsXG4gICAgQ2hlY2tvdXQgPSAnY2hlY2tvdXQnLFxuICAgIFNvbGlkID0gJ3NvbGlkJyxcbiAgICBIaWdobm90ZSA9ICdoaWdobm90ZScsXG4gICAgR2VtaW5pID0gJ2dlbWluaScsXG4gICAgQXBleENsZWFyaW5nID0gJ2FwZXhfY2xlYXJpbmcnLFxuICAgIEd1c3RvID0gJ2d1c3RvJyxcbiAgICBBZHllbiA9ICdhZHllbicsXG4gICAgQXRvbWljID0gJ2F0b21pYycsXG4gICAgSTJjID0gJ2kyYycsXG4gICAgV2VwYXkgPSAnd2VwYXknLFxuICAgIFJpc2tpZmllZCA9ICdyaXNraWZpZWQnLFxuICAgIFV0YiA9ICd1dGInLFxuICAgIEFkcFJvbGwgPSAnYWRwX3JvbGwnLFxuICAgIEZvcnRyZXNzVHJ1c3QgPSAnZm9ydHJlc3NfdHJ1c3QnLFxuICAgIEJvbmQgPSAnYm9uZCcsXG4gICAgQmFra3QgPSAnYmFra3QnLFxuICAgIFRlYWwgPSAndGVhbCcsXG4gICAgWmVyb0hhc2ggPSAnemVyb19oYXNoJyxcbiAgICBUYWJhUGF5ID0gJ3RhYmFfcGF5JyxcbiAgICBLbm90ID0gJ2tub3QnLFxuICAgIFNhcmRpbmUgPSAnc2FyZGluZScsXG4gICAgQWxsb3kgPSAnYWxsb3knLFxuICAgIEZpbml4ID0gJ2Zpbml4JyxcbiAgICBOdXZlaSA9ICdudXZlaScsXG4gICAgTGF5ZXIgPSAnbGF5ZXInLFxuICAgIEJvb20gPSAnYm9vbScsXG4gICAgUGF5bm90ZSA9ICdwYXlub3RlJyxcbiAgICBTdGFrZSA9ICdzdGFrZScsXG4gICAgV2VkYnVzaCA9ICd3ZWRidXNoJyxcbiAgICBFc3VzdSA9ICdlc3VzdScsXG4gICAgQW5zYSA9ICdhbnNhJyxcbiAgICBTY3JpYmV1cCA9ICdzY3JpYmV1cCcsXG4gICAgU3RyYWRkbGUgPSAnc3RyYWRkbGUnXG59XG5cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWAgYW5kIGAvcHJvY2Vzc29yL2FwZXgvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvY2Vzc29yX3Rva2VuYCB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgYnkgdGhlIFBsYWlkIHBhcnRuZXIgdG8gbWFrZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9wZXJtaXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhhdCB0aGUgcHJvY2Vzc29yIGhhcyBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgaW5jbHVkaW5nIGZ1dHVyZSBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhlIHByb2Nlc3NvciB0b2tlbiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8uIEFuIGVtcHR5IGxpc3Qgd2lsbCBncmFudCBhY2Nlc3MgdG8gYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiBhIHByb2Nlc3NvciB1cGRhdGVzIHRoZSB3ZWJob29rIFVSTCBmb3IgYSBwcm9jZXNzb3IgdG9rZW4gdmlhIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBgUFJPQ0VTU09SX1RPS0VOYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiBUbyByZW1vdmUgYSB3ZWJob29rIGZyb20gYSBwcm9jZXNzb3IgdG9rZW4sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSW5jbHVkZSB0aGUgcmF3IHVucGFyc2VkIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5jbHVkZV9wZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBDb3VudGVycGFydGllcyBhbmQgZXh0cmEgbWVyY2hhbnQgZmllbGRzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciwgd2l0aCB0aGUgbW9zdCByZWNlbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNvdW50YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0b3RhbF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkZXBvc2l0b3J5IHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGV4cGVuc2UgdHJhbnNhY3Rpb24gc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG91dGZsb3dfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbiBzdHJlYW1zIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB3ZXJlIHVwZGF0ZWQgb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfZGF0ZXRpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgd2ViaG9vayBpcyBvbmx5IHNlbnQgdG8gW1BsYWlkIHByb2Nlc3NvciBwYXJ0bmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy8pLiAgRmlyZWQgd2hlbiB0cmFuc2FjdGlvbihzKSBmb3IgYW4gSXRlbSBhcmUgZGVsZXRlZC4gVGhlIGRlbGV0ZWQgdHJhbnNhY3Rpb24gSURzIGFyZSBpbmNsdWRlZCBpbiB0aGUgd2ViaG9vayBwYXlsb2FkLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgZGVsZXRlZCB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBpdGVtLiBOb3RlOiBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVfc3RhdHVzOiBUcmFuc2FjdGlvbnNVcGRhdGVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFkZGVkOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIG9uIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIEl0ZW0gc2luY2UgYGN1cnNvcmAgb3JkZXJlZCBieSBhc2NlbmRpbmcgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBBcnJheTxSZW1vdmVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyBhbnkgZnV0dXJlIHVwZGF0ZXMgYWZ0ZXIgdGhlIGxhdGVzdCB1cGRhdGUgcHJvdmlkZWQgaW4gdGhpcyByZXNwb25zZS4gVGhlIGN1cnNvciBvYnRhaW5lZCBhZnRlciBhbGwgcGFnZXMgaGF2ZSBiZWVuIHB1bGxlZCAoaW5kaWNhdGVkIGJ5IGBoYXNfbW9yZWAgYmVpbmcgYGZhbHNlYCkgd2lsbCBiZSB2YWxpZCBmb3IgYXQgbGVhc3QgMSB5ZWFyLiBUaGlzIGN1cnNvciBzaG91bGQgYmUgcGVyc2lzdGVkIGZvciBsYXRlciBjYWxscy4gSWYgdHJhbnNhY3Rpb25zIGFyZSBub3QgeWV0IGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcHJvZHVjdCBhY2Nlc3MgYmVpbmcgcmVxdWVzdGVkLiBVc2VkIHRvIG9yIGRpc2FsbG93IHByb2R1Y3QgYWNjZXNzIGFjcm9zcyBhbGwgYWNjb3VudHMuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBhbGwgcHJvZHVjdHMgYWxsb3dlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3Mge1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRoZSBJZGVudGl0eSBwcm9kdWN0IChuYW1lLCBlbWFpbCwgcGhvbmUsIGFkZHJlc3MpLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBhY2NvdW50IG51bWJlciBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIHRyYW5zYWN0aW9uIGRldGFpbHMuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19kZXRhaWxzX3RyYW5zYWN0aW9ucz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfcm91dGluZ19udW1iZXJcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19yb3V0aW5nX251bWJlcj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byBcXFwiYWNjb3VudHNfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3RheF9zdGF0ZW1lbnRzXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfdGF4X3N0YXRlbWVudHM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImN1c3RvbWVyc19wcm9maWxlc1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGN1c3RvbWVyc19wcm9maWxlcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGBBQ0NFU1NfTk9UX0dSQU5URURgIGVycm9yIGlzIGhpdCBmb3IgQXV0aC4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgYXV0aGAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBBdXRoZW50aWNhdGlvbiBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1BFUk1JU1NJT05TX1JFUVVJUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIElkZW50aXR5LiBUaGUgZXJyb3IgY2FuIGJlIHJlc29sdmVkIGJ5IHB1dHRpbmcgdGhlIHVzZXIgdGhyb3VnaCB1cGRhdGUgbW9kZSB3aXRoIGBpZGVudGl0eWAgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIGFzIHdlbGwgYXMgdGhyb3VnaCB0aGUgbGltaXRlZCBiZXRhIGZvciB1cGRhdGUgbW9kZSBJZGVudGl0eSBwcm9kdWN0IHZhbGlkYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YXR1cyBoZWFsdGggb2YgYSByZXF1ZXN0IHR5cGUuIEF1dGggcmVxdWVzdHMsIEJhbGFuY2UgcmVxdWVzdHMsIElkZW50aXR5IHJlcXVlc3RzLCBJbnZlc3RtZW50cyByZXF1ZXN0cywgTGlhYmlsaXRpZXMgcmVxdWVzdHMsIFRyYW5zYWN0aW9ucyB1cGRhdGVzLCBJbnZlc3RtZW50cyB1cGRhdGVzLCBMaWFiaWxpdGllcyB1cGRhdGVzLCBhbmQgSXRlbSBsb2dpbnMgZWFjaCBoYXZlIHRoZWlyIG93biBzdGF0dXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBgYnJlYWtkb3duYCBvYmplY3QsIHdoaWNoIHByb3ZpZGVzIG1vcmUgZ3JhbnVsYXIgaW5zdGl0dXRpb24gaGVhbHRoIGRhdGEuICBgSEVBTFRIWWA6IHRoZSBtYWpvcml0eSBvZiByZXF1ZXN0cyBhcmUgc3VjY2Vzc2Z1bCBgREVHUkFERURgOiBvbmx5IHNvbWUgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERPV05gOiBhbGwgcmVxdWVzdHMgYXJlIGZhaWxpbmdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdHRlZCB0aW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3RhdHVzIGNoYW5nZSBmb3IgdGhlIGluc3RpdHV0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfY2hhbmdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXNCcmVha2Rvd259XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IFByb2R1Y3RTdGF0dXNCcmVha2Rvd247XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c1N0YXR1c0VudW0ge1xuICAgIEhlYWx0aHkgPSAnSEVBTFRIWScsXG4gICAgRGVncmFkZWQgPSAnREVHUkFERUQnLFxuICAgIERvd24gPSAnRE9XTidcbn1cblxuLyoqXG4gKiBBIGRldGFpbGVkIGJyZWFrZG93biBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIHBlcmZvcm1hbmNlIGZvciBhIHJlcXVlc3QgdHlwZS4gVGhlIHZhbHVlcyBmb3IgYHN1Y2Nlc3NgLCBgZXJyb3JfcGxhaWRgLCBhbmQgYGVycm9yX2luc3RpdHV0aW9uYCBzdW0gdG8gMS4gVGhlIHRpbWUgcmFuZ2UgdXNlZCBmb3IgY2FsY3VsYXRpbmcgdGhlIGJyZWFrZG93biBtYXkgcmFuZ2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgZmV3IG1pbnV0ZXMgdG8gdGhlIHBhc3Qgc2l4IGhvdXJzLiBJbiBnZW5lcmFsLCBzbWFsbGVyIGluc3RpdHV0aW9ucyB3aWxsIHNob3cgc3RhdHVzIHRoYXQgd2FzIGNhbGN1bGF0ZWQgb3ZlciBhIGxvbmdlciBwZXJpb2Qgb2YgdGltZS4gRm9yIEludmVzdG1lbnQgdXBkYXRlcywgd2hpY2ggYXJlIHJlZnJlc2hlZCBsZXNzIGZyZXF1ZW50bHksIHRoZSBwZXJpb2QgYXNzZXNzZWQgbWF5IGJlIDI0IGhvdXJzIG9yIG1vcmUuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbSW5zdGl0dXRpb24gc3RhdHVzIGRldGFpbHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jaW5zdGl0dXRpb24tc3RhdHVzLWRldGFpbHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW4gYXR0ZW1wdHMgdGhhdCBhcmUgc3VjY2Vzc2Z1bCwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgc3VjY2VzczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpbnRlcm5hbCBQbGFpZCBpc3N1ZSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIGVycm9yX3BsYWlkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgbG9naW5zIHRoYXQgYXJlIGZhaWxpbmcgZHVlIHRvIGFuIGlzc3VlIGluIHRoZSBpbnN0aXR1dGlvblxcJ3Mgc3lzdGVtLCBleHByZXNzZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9pbnN0aXR1dGlvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEhvdyBmcmVxdWVudGx5IGRhdGEgZm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cyBsaWtlIEludmVzdG1lbnRzLCBUcmFuc2FjdGlvbnMsIGFuZCBMaWFiaWxpdGllcywgaXMgYmVpbmcgcmVmcmVzaGVkLCByZWxhdGl2ZSB0byB0aGUgaW5zdGl0dXRpb25cXCdzIG5vcm1hbCBzY2hlZHVsaW5nLiBUaGUgYHJlZnJlc2hfaW50ZXJ2YWxgIG1heSBiZSBgREVMQVlFRGAgb3IgYFNUT1BQRURgIGV2ZW4gd2hlbiB0aGUgc3VjY2VzcyByYXRlIGlzIGhpZ2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHJlZnJlc2hfaW50ZXJ2YWw/OiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQcm9kdWN0U3RhdHVzQnJlYWtkb3duUmVmcmVzaEludGVydmFsRW51bSB7XG4gICAgTm9ybWFsID0gJ05PUk1BTCcsXG4gICAgRGVsYXllZCA9ICdERUxBWUVEJyxcbiAgICBTdG9wcGVkID0gJ1NUT1BQRUQnXG59XG5cbi8qKlxuICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoYXQgYW4gaW5zdGl0dXRpb24gY2FuIHN1cHBvcnQuIEFsbCBJdGVtcyBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggYXQgbGVhc3Qgb25lIHByb2R1Y3QuIFRoZSBCYWxhbmNlIHByb2R1Y3QgaXMgYWx3YXlzIGF2YWlsYWJsZSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzcGVjaWZpZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdHMge1xuICAgIEFzc2V0cyA9ICdhc3NldHMnLFxuICAgIEF1dGggPSAnYXV0aCcsXG4gICAgQmFsYW5jZSA9ICdiYWxhbmNlJyxcbiAgICBCYWxhbmNlUGx1cyA9ICdiYWxhbmNlX3BsdXMnLFxuICAgIEJlYWNvbiA9ICdiZWFjb24nLFxuICAgIElkZW50aXR5ID0gJ2lkZW50aXR5JyxcbiAgICBJZGVudGl0eU1hdGNoID0gJ2lkZW50aXR5X21hdGNoJyxcbiAgICBJbnZlc3RtZW50cyA9ICdpbnZlc3RtZW50cycsXG4gICAgSW52ZXN0bWVudHNBdXRoID0gJ2ludmVzdG1lbnRzX2F1dGgnLFxuICAgIExpYWJpbGl0aWVzID0gJ2xpYWJpbGl0aWVzJyxcbiAgICBQYXltZW50SW5pdGlhdGlvbiA9ICdwYXltZW50X2luaXRpYXRpb24nLFxuICAgIElkZW50aXR5VmVyaWZpY2F0aW9uID0gJ2lkZW50aXR5X3ZlcmlmaWNhdGlvbicsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucycsXG4gICAgQ3JlZGl0RGV0YWlscyA9ICdjcmVkaXRfZGV0YWlscycsXG4gICAgSW5jb21lID0gJ2luY29tZScsXG4gICAgSW5jb21lVmVyaWZpY2F0aW9uID0gJ2luY29tZV92ZXJpZmljYXRpb24nLFxuICAgIFN0YW5kaW5nT3JkZXJzID0gJ3N0YW5kaW5nX29yZGVycycsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInLFxuICAgIEVtcGxveW1lbnQgPSAnZW1wbG95bWVudCcsXG4gICAgUmVjdXJyaW5nVHJhbnNhY3Rpb25zID0gJ3JlY3VycmluZ190cmFuc2FjdGlvbnMnLFxuICAgIFRyYW5zYWN0aW9uc1JlZnJlc2ggPSAndHJhbnNhY3Rpb25zX3JlZnJlc2gnLFxuICAgIFNpZ25hbCA9ICdzaWduYWwnLFxuICAgIFN0YXRlbWVudHMgPSAnc3RhdGVtZW50cycsXG4gICAgUHJvY2Vzc29yUGF5bWVudHMgPSAncHJvY2Vzc29yX3BheW1lbnRzJyxcbiAgICBQcm9jZXNzb3JJZGVudGl0eSA9ICdwcm9jZXNzb3JfaWRlbnRpdHknLFxuICAgIFByb2ZpbGUgPSAncHJvZmlsZScsXG4gICAgQ3JhQmFzZVJlcG9ydCA9ICdjcmFfYmFzZV9yZXBvcnQnLFxuICAgIENyYUluY29tZUluc2lnaHRzID0gJ2NyYV9pbmNvbWVfaW5zaWdodHMnLFxuICAgIENyYVBhcnRuZXJJbnNpZ2h0cyA9ICdjcmFfcGFydG5lcl9pbnNpZ2h0cycsXG4gICAgQ3JhTmV0d29ya0luc2lnaHRzID0gJ2NyYV9uZXR3b3JrX2luc2lnaHRzJyxcbiAgICBDcmFDYXNoZmxvd0luc2lnaHRzID0gJ2NyYV9jYXNoZmxvd19pbnNpZ2h0cycsXG4gICAgTGF5ZXIgPSAnbGF5ZXInLFxuICAgIFBheUJ5QmFuayA9ICdwYXlfYnlfYmFuaydcbn1cblxuLyoqXG4gKiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvZmlsZS9uZXR3b3JrX3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IE5ldHdvcmtTdGF0dXNHZXRVc2VyO1xufVxuLyoqXG4gKiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV0d29ya19zdGF0dXM6IE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB2YWxpZCBuYW1lIG1hdGNoaW5nIHNlbnNpdGl2aXR5IGNvbmZpZ3VyYXRpb25zIGZvciBhIHNjcmVlbmluZyBwcm9ncmFtLiBOb3RlIHRoYXQgd2hpbGUgY2VydGFpbiBtYXRjaGluZyB0ZWNobmlxdWVzIG1heSBiZSBtb3JlIHByZXZhbGVudCBvbiBsZXNzIHN0cmljdCBzZXR0aW5ncywgYWxsIG1hdGNoaW5nIGFsZ29yaXRobXMgYXJlIGVuYWJsZWQgZm9yIGV2ZXJ5IHNlbnNpdGl2aXR5LiAgYGNvYXJzZWAgLSBTZWUgbW9yZSBwb3RlbnRpYWwgbWF0Y2hlcy4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIHNlZSBtb3JlIGJyb2FkIHBob25ldGljIG1hdGNoZXMgYWNyb3NzIGFscGhhYmV0cyB0aGF0IG1ha2UgbWlzc2luZyBhIHBvdGVudGlhbCBoaXQgdmVyeSB1bmxpa2VseS4gVGhpcyBzZXR0aW5nIGlzIG5vaXNpZXIgYW5kIHdpbGwgcmVxdWlyZSBtb3JlIG1hbnVhbCByZXZpZXcuICBgYmFsYW5jZWRgIC0gQSBnb29kIGRlZmF1bHQgZm9yIG1vc3QgY29tcGFuaWVzLiBUaGlzIHNlbnNpdGl2aXR5IGlzIGJhbGFuY2VkIHRvIHNob3cgaGlnaCBxdWFsaXR5IGhpdHMgd2l0aCByZWR1Y2VkIG5vaXNlLiAgYHN0cmljdGAgLSBBZ2dyZXNzaXZlIGZhbHNlIHBvc2l0aXZlIHJlZHVjdGlvbi4gVGhpcyBzZW5zaXRpdml0eSB3aWxsIHJlcXVpcmUgbmFtZXMgdG8gYmUgbW9yZSBzaW1pbGFyIHRoYW4gYGNvYXJzZWAgYW5kIGBiYWxhbmNlZGAgc2V0dGluZ3MsIHJlbHlpbmcgbGVzcyBvbiBwaG9uZXRpY3MsIHdoaWxlIHN0aWxsIGFjY291bnRpbmcgZm9yIGNoYXJhY3RlciB0cmFuc3Bvc2l0aW9ucywgbWlzc2luZyB0b2tlbnMsIGFuZCBvdGhlciBjb21tb24gcGVybXV0YXRpb25zLiAgYGV4YWN0YCAtIE1hdGNoZXMgbXVzdCBiZSBuZWFybHkgZXhhY3QuIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCBvbmx5IHNob3cgaGl0cyB3aXRoIGV4YWN0IG9yIG5lYXJseSBleGFjdCBuYW1lIG1hdGNoZXMgd2l0aCBvbmx5IGJhc2ljIGNvcnJlY3Rpb24gc3VjaCBhcyBleHRyYW5lb3VzIHN5bWJvbHMgYW5kIGNhcGl0YWxpemF0aW9uLiBUaGlzIHNldHRpbmcgaXMgZ2VuZXJhbGx5IG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91IGhhdmUgYSB2ZXJ5IHNwZWNpZmljIHVzZSBjYXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUHJvZ3JhbU5hbWVTZW5zaXRpdml0eSB7XG4gICAgQ29hcnNlID0gJ2NvYXJzZScsXG4gICAgQmFsYW5jZWQgPSAnYmFsYW5jZWQnLFxuICAgIFN0cmljdCA9ICdzdHJpY3QnLFxuICAgIEV4YWN0ID0gJ2V4YWN0J1xufVxuXG4vKipcbiAqIFRoZSBlbXBsb3llZVxcJ3MgZXN0aW1hdGVkIGFubnVhbCBzYWxhcnksIGFzIGRlcml2ZWQgZnJvbSBpbmZvcm1hdGlvbiByZXBvcnRlZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvamVjdGVkSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIG5ldHdvcmsgcHJveHkgaXMgcHJlc2VudCBhbmQgaWYgc28gd2hhdCB0eXBlIGl0IGlzLiAgYG5vbmVfZGV0ZWN0ZWRgIGluZGljYXRlcyB0aGUgdXNlciBpcyBub3Qgb24gYSBkZXRlY3RhYmxlIHByb3h5IG5ldHdvcmsuICBgdG9yYCBpbmRpY2F0ZXMgdGhlIHVzZXIgd2FzIHVzaW5nIGEgVG9yIGJyb3dzZXIsIHdoaWNoIHNlbmRzIGVuY3J5cHRlZCB0cmFmZmljIG9uIGEgZGVjZW50cmFsaXplZCBuZXR3b3JrIGFuZCBpcyBzb21ld2hhdCBzaW1pbGFyIHRvIGEgVlBOIChWaXJ0dWFsIFByaXZhdGUgTmV0d29yaykuICBgdnBuYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgb24gYSBWUE4gKFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrKSAgYHdlYl9wcm94eWAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgd2ViIHByb3h5IHNlcnZlciwgd2hpY2ggbWF5IGFsbG93IHRoZW0gdG8gY29uY2VhbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZWlyIElQIGFkZHJlc3Mgb3Igb3RoZXIgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uICBgcHVibGljX3Byb3h5YCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgb24gYSBwdWJsaWMgd2ViIHByb3h5IHNlcnZlciwgd2hpY2ggaXMgc2ltaWxhciB0byBhIHdlYiBwcm94eSBidXQgY2FuIGJlIHNoYXJlZCBieSBtdWx0aXBsZSB1c2Vycy4gVGhpcyBtYXkgYWxsb3cgbXVsdGlwbGUgdXNlcnMgdG8gYXBwZWFyIGFzIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBJUCBhZGRyZXNzIGZvciBpbnN0YW5jZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb3h5VHlwZSB7XG4gICAgTm9uZURldGVjdGVkID0gJ25vbmVfZGV0ZWN0ZWQnLFxuICAgIFRvciA9ICd0b3InLFxuICAgIFZwbiA9ICd2cG4nLFxuICAgIFdlYlByb3h5ID0gJ3dlYl9wcm94eScsXG4gICAgUHVibGljUHJveHkgPSAncHVibGljX3Byb3h5J1xufVxuXG4vKipcbiAqIFRoZSByZXF1ZXN0IHdhcyBmbGFnZ2VkIGJ5IFBsYWlkXFwncyBmcmF1ZCBzeXN0ZW0sIGFuZCByZXF1aXJlcyBhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiB0byBlbnN1cmUgdGhleSBhcmUgbm90IGEgYm90LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvciB7XG4gICAgLyoqXG4gICAgICogUkVDQVBUQ0hBX0VSUk9SXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSRUNBUFRDSEFfUkVRVUlSRURcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA0MDBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgaHR0cF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8gc29sdmUgYSBHb29nbGUgcmVDQVBUQ0hBIGNoYWxsZW5nZSBpbiB0aGUgTGluayBSZWNhcHRjaGEgcGFuZS4gSWYgdGhleSBzb2x2ZSB0aGUgY2hhbGxlbmdlIHN1Y2Nlc3NmdWxseSwgdGhlIHVzZXJcXCdzIHJlcXVlc3QgaXMgcmVzdWJtaXR0ZWQgYW5kIHRoZXkgYXJlIGRpcmVjdGVkIHRvIHRoZSBuZXh0IEl0ZW0gY3JlYXRpb24gc3RlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgbGlua191c2VyX2V4cGVyaWVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtIGRldGVjdHMgYWJ1c2l2ZSB0cmFmZmljIGFuZCBjb25zaWRlcnMgYSB2YXJpZXR5IG9mIHBhcmFtZXRlcnMgdGhyb3VnaG91dCBJdGVtIGNyZWF0aW9uIHJlcXVlc3RzLiBXaGVuIGEgcmVxdWVzdCBpcyBjb25zaWRlcmVkIHJpc2t5IG9yIHBvc3NpYmx5IGZyYXVkdWxlbnQsIExpbmsgcHJlc2VudHMgYSByZUNBUFRDSEEgZm9yIHRoZSB1c2VyIHRvIHNvbHZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBjb21tb25fY2F1c2VzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGluayB3aWxsIGF1dG9tYXRpY2FsbHkgZ3VpZGUgeW91ciB1c2VyIHRocm91Z2ggcmVDQVBUQ0hBIHZlcmlmaWNhdGlvbi4gQXMgYSBnZW5lcmFsIHJ1bGUsIHdlIHJlY29tbWVuZCBpbnN0cnVtZW50aW5nIGJhc2ljIGZyYXVkIG1vbml0b3JpbmcgdG8gZGV0ZWN0IGFuZCBwcm90ZWN0IHlvdXIgd2Vic2l0ZSBmcm9tIHNwYW0gYW5kIGFidXNlLiAgSWYgeW91ciB1c2VyIGNhbm5vdCB2ZXJpZnkgdGhlaXIgc2Vzc2lvbiwgcGxlYXNlIHN1Ym1pdCBhIFN1cHBvcnQgdGlja2V0IHdpdGggdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogYGxpbmtfc2Vzc2lvbl9pZGAgb3IgYHJlcXVlc3RfaWRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIHRyb3VibGVzaG9vdGluZ19zdGVwczogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJBQ1MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgeW91IG5lZWQgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQkFDUyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNpcGllbnRCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG9mIHRoZSBhY2NvdW50LiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJBQ1MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhpcyByZWNpcGllbnQgbmVlZHMgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQkFDUyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNpcGllbnRCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc2lnaHRzIHJlbGF0aW5nIHRvIGV4cGVuc2VzIGFuZCBkZXBvc2l0cyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gb2NjdXIgb24gYSBzY2hlZHVsZWQgYmFzaXMsIHN1Y2ggYXMgYml3ZWVrbHksIG1vbnRobHksIG9yIGFubnVhbGx5LiAgQ29tbW9uIGV4YW1wbGVzIGluY2x1ZGUgbG9hbiBwYXltZW50cywgYmlsbCBwYXltZW50cywgc3Vic2NyaXB0aW9ucywgYW5kIHBheXJvbGwgaW5jb21lLiAgVGhpcyBpcyBhIGJldGEgZmllbGQsIGF2YWlsYWJsZSB0byBhbGwgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdHJhbnNhY3Rpb24gaXMgcGVyaW9kaWNhbGx5IHJlY3VycmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyZW5jZVxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmVuY2VcbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNhbmNlbGxlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19DQU5DRUxMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYFdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgd2Vlay4gIGBCSVdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgMiB3ZWVrcy4gIGBTRU1JX01PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IHR3aWNlIHBlciBtb250aC4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zLiAgYE1PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IG1vbnRoLiAgYEFOTlVBTExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB5ZWFyLiAgYERBSUxZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBkYXkuICBgRFlOQU1JQ2A6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgdmFyaWVzIGluIHJlY3VycmVuY2UgZnJlcXVlbmN5LiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHN0cmVhbXMgaW4gdGhlIGdpZyBlY29ub215LiAgYFVOS05PV05gOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IGlzblxcJ3QgcmVjdXJyaW5nIGluIG5hdHVyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ0ZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgRHluYW1pYyA9ICdEWU5BTUlDJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW0ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudC1wcm92aWRlZCByYXcgZGVzY3JpcHRpb24gb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgb3IgcHJpbWFyeSBjb3VudGVycGFydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gZWFjaCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19hcGFydDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgbmV3IHRyYW5zZmVyIG9mIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIG9yaWdpbmF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfTkVXX1RSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBkb2VzIG5vdCBmaXQgYW55IG9mIHRoZSBwcmUtZGVmaW5lZCBmcmVxdWVuY2llcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBlbmRwb2ludFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBpbmNvbWUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBzdWJzY3JpcHRpb25zLCBiaWxscywgbG9hbiBwYXltZW50cykuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIGZvciBhY2NvdW50cyB0aGF0IGhhdmUgbmV3IG9yIHVwZGF0ZWQgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gIFRoZSBuZXh0IHRyYW5zZmVyIG9yaWdpbmF0aW9uIGRhdGUgYWZ0ZXIgYmFuayBob2xpZGF5IGFkanVzdG1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiAgVGhlIG5leHQgdHJhbnNmZXIgb3JpZ2luYXRpb24gZGF0ZSBhZnRlciBiYW5rIGhvbGlkYXkgYWRqdXN0bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIG9uIHRoZSBwbGFubmVkIGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNGRVJfU0tJUFBFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlX2NvZGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYW5uZWQgZGF0ZSBvbiB3aGljaCBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgc2tpcHBlZF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSByZW1vdmVkIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcG9ydCB0eXBlLiBJdCBjYW4gYmUgYGFzc2V0YC4gSW5jb21lIHJlcG9ydCB0eXBlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZXBvcnRUeXBlIHtcbiAgICBBc3NldCA9ICdhc3NldCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGJlaGF2aW9yYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2ssIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0JlaGF2aW9yIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgdXNlcl9pbnRlcmFjdGlvbnM6IFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgZnJhdWRfcmluZ19kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgYm90X2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbFdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbFdpdGhOb0RhdGE7XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBib3QgZGV0ZWN0aW9uIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGZyYXVkIHJpbmcgYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG92ZXJhbGwgdXNlciBpbnRlcmFjdGlvbiBzaWduYWxzIG9mIGEgYmVoYXZpb3IgcmlzayBjaGVjay4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIGhvdyBmYW1pbGlhciB0aGUgdXNlciBpcyB3aXRoIHRoZSBwZXJzb25hbCBkYXRhIHRoZXkgcHJvdmlkZSwgYmFzZWQgb24gYSBudW1iZXIgb2Ygc2lnbmFscyB0aGF0IGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHRoZWlyIHNlc3Npb24uICBgZ2VudWluZWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBoaWdoIGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyB1bmxpa2VseS4gIGBuZXV0cmFsYCBpbmRpY2F0ZXMgc29tZSBzaWduYWxzIGFyZSBwcmVzZW50IGluIGJldHdlZW4gYHJpc2t5YCBhbmQgYGdlbnVpbmVgLCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2xlYXIgc2lnbmFscyB0byBkZXRlcm1pbmUgYW4gb3V0Y29tZS4gIGByaXNreWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBsb3cgZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIGxpa2VseS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbCB7XG4gICAgR2VudWluZSA9ICdnZW51aW5lJyxcbiAgICBOZXV0cmFsID0gJ25ldXRyYWwnLFxuICAgIFJpc2t5ID0gJ3Jpc2t5JyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYmVoYXZpb3I6IFJpc2tDaGVja0JlaGF2aW9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbDogUmlza0NoZWNrRW1haWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tQaG9uZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lOiBSaXNrQ2hlY2tQaG9uZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmVzdWx0IHN1bW1hcnkgb2JqZWN0cyBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tEZXZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGV2aWNlczogQXJyYXk8Umlza0NoZWNrRGV2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZGVudGl0eV9hYnVzZV9zaWduYWxzOiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogUmlza0NoZWNrTmV0d29yayB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm94eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3Byb3h5X3R5cGU6IFByb3h5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2Ygc3BhbSBsaXN0cyB0aGUgSVAgYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfc3BhbV9saXN0X2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVUQyBvZmZzZXQgb2YgdGhlIHRpbWV6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVAgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF90aW1lem9uZV9vZmZzZXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgZW1haWxgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRW1haWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBpc19kZWxpdmVyYWJsZTogUmlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIENvdW50IG9mIGFsbCBrbm93biBicmVhY2hlcyBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBicmVhY2hfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZmlyc3RfYnJlYWNoZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgbGFzdF9icmVhY2hlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5fcmVnaXN0ZXJlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfZnJlZV9wcm92aWRlcjogUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfY3VzdG9tOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfZGlzcG9zYWJsZTogUmlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgdG9wX2xldmVsX2RvbWFpbl9pc19zdXNwaWNpb3VzOiBSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBlbWFpbCBhZGRyZXNzIGhhcyBiZWVuIGRldGVjdGVkIHRvIGhhdmUgYWNjb3VudHMgb3Igb3RoZXIgYWN0aXZpdHkuXG4gICAgICogQHR5cGUge1NldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsaW5rZWRfc2VydmljZXM6IFNldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGN1c3RvbSBpZiBrbm93biwgaS5lLiBhIGNvbXBhbnkgZG9tYWluIGFuZCBub3QgZnJlZSBvciBkaXNwb3NhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBkb21haW4gaXMgbGlzdGVkIGFzIGRpc3Bvc2FibGUgaWYga25vd24uIERpc3Bvc2FibGUgZG9tYWlucyBhcmUgb2Z0ZW4gdXNlZCB0byBjcmVhdGUgZW1haWwgYWRkcmVzc2VzIHRoYXQgYXJlIHBhcnQgb2YgYSBmYWtlIHNldCBvZiB1c2VyIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGRvbWFpbiBpcyBhIGZyZWUgcHJvdmlkZXIgc3VjaCBhcyBHbWFpbCBvciBIb3RtYWlsIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlciB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFNNVFAtTVggY2hlY2sgdG8gY29uZmlybSB0aGUgZW1haWwgYWRkcmVzcyBleGlzdHMgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyB0b3AgbGV2ZWwgZG9tYWluLCB3aGljaCBpcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBkb21haW4sIGlzIGZyYXVkdWxlbnQgb3Igcmlza3kgaWYga25vd24uIEluIG1vc3QgY2FzZXMsIGEgc3VzcGljaW91cyB0b3AgbGV2ZWwgZG9tYWluIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIGEgZGlzcG9zYWJsZSBvciBoaWdoLXJpc2sgZG9tYWluLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBjYXB0dXJpbmcgYWJ1c2Ugc2lnbmFscyByZWxhdGVkIHRvIGBpZGVudGl0eSBhYnVzZWAsIGUuZy4gc3RvbGVuIGFuZCBzeW50aGV0aWMgaWRlbnRpdHkgZnJhdWQuIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBVUyBpZGVudGl0aWVzIGFuZCBzb21lIHNpZ25hbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIHdoYXQgaW5mb3JtYXRpb24gd2FzIGNvbGxlY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN5bnRoZXRpY19pZGVudGl0eTogUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAgICAgKi9cbiAgICBzdG9sZW5faWRlbnRpdHk6IFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgbGlua2VkIHNlcnZpY2UuIE5vdGUgdGhhdCBgYWR1bHRfc2l0ZXNgIHJlZmVyc1xcJyB0byBleHBsaWNpdCB2aWRlbyBjb250ZW50LCBhbmQgaW5jbHVkZXMgYSBudW1iZXIgb2YgcmVsYXRlZCBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0xpbmtlZFNlcnZpY2Uge1xuICAgIEFib3V0bWUgPSAnYWJvdXRtZScsXG4gICAgQWRvYmUgPSAnYWRvYmUnLFxuICAgIEFkdWx0U2l0ZXMgPSAnYWR1bHRfc2l0ZXMnLFxuICAgIEFpcmJuYiA9ICdhaXJibmInLFxuICAgIEFsdGJhbGFqaSA9ICdhbHRiYWxhamknLFxuICAgIEFtYXpvbiA9ICdhbWF6b24nLFxuICAgIEFwcGxlID0gJ2FwcGxlJyxcbiAgICBBcmNoaXZlb3JnID0gJ2FyY2hpdmVvcmcnLFxuICAgIEF0bGFzc2lhbiA9ICdhdGxhc3NpYW4nLFxuICAgIEJpdG1vamkgPSAnYml0bW9qaScsXG4gICAgQm9keWJ1aWxkaW5nID0gJ2JvZHlidWlsZGluZycsXG4gICAgQm9va2luZyA9ICdib29raW5nJyxcbiAgICBCdWthbGFwYWsgPSAnYnVrYWxhcGFrJyxcbiAgICBDb2RlY2FkZW15ID0gJ2NvZGVjYWRlbXknLFxuICAgIERlbGl2ZXJvbyA9ICdkZWxpdmVyb28nLFxuICAgIERpaWdvID0gJ2RpaWdvJyxcbiAgICBEaXNjb3JkID0gJ2Rpc2NvcmQnLFxuICAgIERpc25leXBsdXMgPSAnZGlzbmV5cGx1cycsXG4gICAgRHVvbGluZ28gPSAnZHVvbGluZ28nLFxuICAgIEViYXkgPSAnZWJheScsXG4gICAgRW52YXRvID0gJ2VudmF0bycsXG4gICAgRXZlbnRicml0ZSA9ICdldmVudGJyaXRlJyxcbiAgICBFdmVybm90ZSA9ICdldmVybm90ZScsXG4gICAgRmFjZWJvb2sgPSAnZmFjZWJvb2snLFxuICAgIEZpcmVmb3ggPSAnZmlyZWZveCcsXG4gICAgRmxpY2tyID0gJ2ZsaWNrcicsXG4gICAgRmxpcGthcnQgPSAnZmxpcGthcnQnLFxuICAgIEZvdXJzcXVhcmUgPSAnZm91cnNxdWFyZScsXG4gICAgRnJlZWxhbmNlciA9ICdmcmVlbGFuY2VyJyxcbiAgICBHYWFuYSA9ICdnYWFuYScsXG4gICAgR2lwaHkgPSAnZ2lwaHknLFxuICAgIEdpdGh1YiA9ICdnaXRodWInLFxuICAgIEdvb2dsZSA9ICdnb29nbGUnLFxuICAgIEdyYXZhdGFyID0gJ2dyYXZhdGFyJyxcbiAgICBIdWJzcG90ID0gJ2h1YnNwb3QnLFxuICAgIEltZ3VyID0gJ2ltZ3VyJyxcbiAgICBJbnN0YWdyYW0gPSAnaW5zdGFncmFtJyxcbiAgICBKZGlkID0gJ2pkaWQnLFxuICAgIEtha2FvID0gJ2tha2FvJyxcbiAgICBLb21tbyA9ICdrb21tbycsXG4gICAgS29tb290ID0gJ2tvbW9vdCcsXG4gICAgTGFzdGZtID0gJ2xhc3RmbScsXG4gICAgTGF6YWRhID0gJ2xhemFkYScsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBMaW5rZWRpbiA9ICdsaW5rZWRpbicsXG4gICAgTWFpbHJ1ID0gJ21haWxydScsXG4gICAgTWljcm9zb2Z0ID0gJ21pY3Jvc29mdCcsXG4gICAgTXlzcGFjZSA9ICdteXNwYWNlJyxcbiAgICBOZXRmbGl4ID0gJ25ldGZsaXgnLFxuICAgIE5pa2UgPSAnbmlrZScsXG4gICAgT2sgPSAnb2snLFxuICAgIFBhdHJlb24gPSAncGF0cmVvbicsXG4gICAgUGludGVyZXN0ID0gJ3BpbnRlcmVzdCcsXG4gICAgUGx1cmsgPSAncGx1cmsnLFxuICAgIFF1b3JhID0gJ3F1b3JhJyxcbiAgICBRem9uZSA9ICdxem9uZScsXG4gICAgUmFtYmxlciA9ICdyYW1ibGVyJyxcbiAgICBSYXBwaSA9ICdyYXBwaScsXG4gICAgUmVwbGl0ID0gJ3JlcGxpdCcsXG4gICAgU2Ftc3VuZyA9ICdzYW1zdW5nJyxcbiAgICBTZW9jbGVya3MgPSAnc2VvY2xlcmtzJyxcbiAgICBTaG9wY2x1ZXMgPSAnc2hvcGNsdWVzJyxcbiAgICBTa3lwZSA9ICdza3lwZScsXG4gICAgU25hcGNoYXQgPSAnc25hcGNoYXQnLFxuICAgIFNuYXBkZWFsID0gJ3NuYXBkZWFsJyxcbiAgICBTb3VuZGNsb3VkID0gJ3NvdW5kY2xvdWQnLFxuICAgIFNwb3RpZnkgPSAnc3BvdGlmeScsXG4gICAgU3RhcnogPSAnc3RhcnonLFxuICAgIFN0cmF2YSA9ICdzdHJhdmEnLFxuICAgIFRhcmluZ2EgPSAndGFyaW5nYScsXG4gICAgVGVsZWdyYW0gPSAndGVsZWdyYW0nLFxuICAgIFRpa2kgPSAndGlraScsXG4gICAgVG9rb3BlZGlhID0gJ3Rva29wZWRpYScsXG4gICAgVHJlZWhvdXNlID0gJ3RyZWVob3VzZScsXG4gICAgVHVtYmxyID0gJ3R1bWJscicsXG4gICAgVHdpdHRlciA9ICd0d2l0dGVyJyxcbiAgICBWZW5tbyA9ICd2ZW5tbycsXG4gICAgVmliZXIgPSAndmliZXInLFxuICAgIFZpbWVvID0gJ3ZpbWVvJyxcbiAgICBWaXZpbm8gPSAndml2aW5vJyxcbiAgICBWa29udGFrdGUgPSAndmtvbnRha3RlJyxcbiAgICBXYXR0cGFkID0gJ3dhdHRwYWQnLFxuICAgIFdlaWJvID0gJ3dlaWJvJyxcbiAgICBXaGF0c2FwcCA9ICd3aGF0c2FwcCcsXG4gICAgV29yZHByZXNzID0gJ3dvcmRwcmVzcycsXG4gICAgWGluZyA9ICd4aW5nJyxcbiAgICBZYWhvbyA9ICd5YWhvbycsXG4gICAgWWFuZGV4ID0gJ3lhbmRleCcsXG4gICAgWmFsbyA9ICd6YWxvJyxcbiAgICBab2hvID0gJ3pvaG8nXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBuZXR3b3JrIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrTmV0d29ya1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja05ldHdvcmsge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja05ldHdvcmtcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrTmV0d29ya1xuICAgICAqL1xuICAgIGZhY3RvcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYHBob25lYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBwaG9uZSBudW1iZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGZhY3RvcnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN0b2xlbiBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN5bnRoZXRpYyBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTeW50aGV0aWNGcmF1ZH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICBmaXJzdF9wYXJ0eV9zeW50aGV0aWNfZnJhdWQ/OiBTeW50aGV0aWNGcmF1ZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N5bnRoZXRpY0ZyYXVkfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3N5bnRoZXRpY19mcmF1ZD86IFN5bnRoZXRpY0ZyYXVkIHwgbnVsbDtcbn1cbi8qKlxuICogUmlzayBsZXZlbCBmb3IgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tMZXZlbCB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJ1xufVxuXG4vKipcbiAqIFJpc2sgbGV2ZWwgZm9yIHRoZSBnaXZlbiByaXNrIGNoZWNrIHR5cGUsIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0xldmVsV2l0aE5vRGF0YSB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSaXNrUHJvZmlsZSBpcyBkZXByZWNhdGVkLCB1c2UgYHJ1bGVzZXRgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tQcm9maWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1Byb2ZpbGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIHJpc2sgcHJvZmlsZSB1c2VkIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAga2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBsaXN0IG9mIG91dGNvbWVzLCBzdWNoIGFzIFxcXCJhY2NlcHRcXFwiLCBcXFwicmV2aWV3XFxcIiwgYW5kIFxcXCJkZWNsaW5lXFxcIiB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgYSBjb2RlIGFuZCBkZXNjcmlwdGlvbiB0byBkZXNjcmliZSBtZWRpdW0gcmlzayB0cmFuc2FjdGlvbnMgYW5kIGFib3ZlIG9uIC9hY2NvdW50cy9iYWxhbmNlL2dldC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1JlYXNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tSZWFzb24ge1xuICAgIC8qKlxuICAgICAqIEEgY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgcmlzayBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiAgVGhlIGNvZGVzIGFyZSBmcm9tIFBMMDEgdG8gUEwwOCBhbmQgZnJvbSBCSzAxIHRvIEJLMDcuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiByaXNrIHJlYXNvbiBjb2Rlcywgc2VlIFtSaXNrIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNyaXNrLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrUmVhc29uXG4gICAgICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZXhwbGFpbmluZyB0aGUgcmlzayBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gYW5kIHNvbWUgcmVjb21tZW5kZWQgYWN0aW9ucy4gVGhpcyBmaWVsZCBpcyBzdWJqZWN0IHRvIGNoYW5nZTsgYW55IHByb2dyYW1tYXRpYyBsb2dpYyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGBjb2RlYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tSZWFzb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBmb3IgdGhlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgc3RhdHVzPzogUmlza1NpZ25hbERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlPzogUmlza1NpZ25hbERvY3VtZW50VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxGaWxlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZmlsZV90eXBlPzogUmlza1NpZ25hbEZpbGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogVHlwZSBvZiBhIGRvY3VtZW50IGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbERvY3VtZW50VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBCYW5rU3RhdGVtZW50ID0gJ0JBTktfU1RBVEVNRU5UJyxcbiAgICBCZW5lZml0c1N0YXRlbWVudCA9ICdCRU5FRklUU19TVEFURU1FTlQnLFxuICAgIEJ1c2luZXNzRmlsaW5nID0gJ0JVU0lORVNTX0ZJTElORycsXG4gICAgQ2hlY2sgPSAnQ0hFQ0snLFxuICAgIERyaXZpbmdMaWNlbnNlID0gJ0RSSVZJTkdfTElDRU5TRScsXG4gICAgRmluYW5jaWFsU3RhdGVtZW50ID0gJ0ZJTkFOQ0lBTF9TVEFURU1FTlQnLFxuICAgIEludm9pY2UgPSAnSU5WT0lDRScsXG4gICAgUGF5c2xpcCA9ICdQQVlTTElQJyxcbiAgICBTb2NpYWxTZWN1cml0eUNhcmQgPSAnU09DSUFMX1NFQ1VSSVRZX0NBUkQnLFxuICAgIFRheEZvcm0gPSAnVEFYX0ZPUk0nLFxuICAgIFV0aWxpdHlCaWxsID0gJ1VUSUxJVFlfQklMTCdcbn1cblxuLyoqXG4gKiBUaGUgZmlsZSB0eXBlIGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbEZpbGVUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEltYWdlUGRmID0gJ0lNQUdFX1BERicsXG4gICAgU2Nhbk9jciA9ICdTQ0FOX09DUicsXG4gICAgVHJ1ZVBkZiA9ICdUUlVFX1BERicsXG4gICAgSW1hZ2UgPSAnSU1BR0UnLFxuICAgIE1peGVkUGFnZVBkZiA9ICdNSVhFRF9QQUdFX1BERicsXG4gICAgRW1wdHlQZGYgPSAnRU1QVFlfUERGJyxcbiAgICBGbGF0dGVuZWRQZGYgPSAnRkxBVFRFTkVEX1BERidcbn1cblxuLyoqXG4gKiBBRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVEZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIFJvbGVcbiAgICAgKi9cbiAgICBST0xFX0RFVEFJTDogUm9sZURldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlRGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5Um9sZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJvbGVEZXRhaWxcbiAgICAgKi9cbiAgICBQYXJ0eVJvbGVUeXBlOiBQYXJ0eVJvbGVUeXBlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJvbGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlc1xuICAgICAqL1xuICAgIFJPTEU6IFJvbGU7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHRyYW5zYWN0aW9uIHJlc3VsdCBhZnRlciBldmFsdWF0ZWQgYnkgdGhlIHJlcXVlc3RlZCBSdWxlc2V0LiBJZiBhIGBydWxlc2V0X2tleWAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJ1bGVzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlc2V0IHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBSdWxlc2V0IHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBsaXN0IG9mIG91dGNvbWVzLCBzdWNoIGFzIFxcXCJhY2NlcHRcXFwiLCBcXFwicmV2aWV3XFxcIiwgYW5kIFxcXCJkZWNsaW5lXFxcIiB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVzZXRcbiAgICAgKi9cbiAgICBvdXRjb21lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTTVNWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTTVNWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTTVNWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogU01TVmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdHRlbXB0IGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgU01TIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlbGl2ZXJ5IGF0dGVtcHRzIG1hZGUgd2l0aGluIHRoZSB2ZXJpZmljYXRpb24gdG8gc2VuZCB0aGUgU01TIGNvZGUgdG8gdGhlIHVzZXIuIEVhY2ggZGVsaXZlcnkgYXR0ZW1wdCByZXByZXNlbnRzIHRoZSB1c2VyIHRha2luZyBhY3Rpb24gZnJvbSB0aGUgZnJvbnQgZW5kIFVJIHRvIHJlcXVlc3QgY3JlYXRpb24gYW5kIGRlbGl2ZXJ5IG9mIGEgbmV3IFNNUyB2ZXJpZmljYXRpb24gY29kZSwgb3IgdG8gcmVzZW5kIGFuIGV4aXN0aW5nIFNNUyB2ZXJpZmljYXRpb24gY29kZS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIGRlbGl2ZXJ5IGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZGVsaXZlcnlfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgbWFkZSBieSB0aGUgdXNlciB3aXRoaW4gdGhlIHZlcmlmaWNhdGlvbiB0byB2ZXJpZnkgdGhlIFNNUyBjb2RlIGJ5IGVudGVyaW5nIGl0IGludG8gdGhlIGZyb250IGVuZCBVSS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIHNvbHZlIGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc29sdmVfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpbml0aWFsbHlfc2VudF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9zZW50X2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU01TVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnXG59XG5cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuIElmIHByb3ZpZGVkLCB0aGlzIHdpbGwgb3ZlcnJpZGUgdGhlIFVSTCBzZXQgaW4gdGhlIGRhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfb3ZlcnJpZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19maWVsZHM6IFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcztcbn1cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBjb2RlcyB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHRlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGUge1xuICAgIFVwZGF0ZSA9ICdCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURScsXG4gICAgQ29tcGxldGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9DT01QTEVURSdcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBmaWVsZHMgd2hpY2ggd2lsbCBiZSBwb3B1bGF0ZWQgaW4gdGhlIHNpbXVsYXRlZCB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYGZhaWxlZGAsIG9yIGByZXZlcnNlZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBwZW5kaW5nYCAtLT4gYGZhaWxlZGAgIGBwZW5kaW5nYCAtLT4gYHBvc3RlZGAgIGBwb3N0ZWRgIC0tPiBgcmV2ZXJzZWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBzYW5kYm94L2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBXZWJob29rVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBjb2RlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtIHtcbiAgICBEZWZhdWx0VXBkYXRlID0gJ0RFRkFVTFRfVVBEQVRFJyxcbiAgICBOZXdBY2NvdW50c0F2YWlsYWJsZSA9ICdORVdfQUNDT1VOVFNfQVZBSUxBQkxFJyxcbiAgICBTbXNNaWNyb2RlcG9zaXRzVmVyaWZpY2F0aW9uID0gJ1NNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTicsXG4gICAgQXV0aG9yaXphdGlvbkdyYW50ZWQgPSAnQVVUSE9SSVpBVElPTl9HUkFOVEVEJyxcbiAgICBQZW5kaW5nRGlzY29ubmVjdCA9ICdQRU5ESU5HX0RJU0NPTk5FQ1QnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZSA9ICdSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURScsXG4gICAgTG9naW5SZXBhaXJlZCA9ICdMT0dJTl9SRVBBSVJFRCcsXG4gICAgU3luY1VwZGF0ZXNBdmFpbGFibGUgPSAnU1lOQ19VUERBVEVTX0FWQUlMQUJMRScsXG4gICAgUHJvZHVjdFJlYWR5ID0gJ1BST0RVQ1RfUkVBRFknLFxuICAgIEVycm9yID0gJ0VSUk9SJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBpcyBgdHJ1ZWAgIGlmIHRoZSB0ZXN0YCB3ZWJob29rX2NvZGVgICB3YXMgc3VjY2Vzc2Z1bGx5IGZpcmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rX2ZpcmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXNldF9sb2dpbjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB3aG9zZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHRvIGJlIG1vZGlmaWVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIHRvIHNldCB0aGUgYWNjb3VudCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHNhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIG9hdXRoX3N0YXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdG8gc2ltdWxhdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIHRvIHNldCB0aGUgcGF5bWVudCB0by4gICBWYWxpZCBzdGF0dXNlcyBpbmNsdWRlOiAtIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgIC0gYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2AgLSBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAgLSBgUEFZTUVOVF9TVEFUVVNfU0VUVExFRGAgLSBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIHNldCBvZiBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb25maWd1cmluZyB0aGUgSXRlbS4gSWYgc3BlY2lmaWVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcHJvY2Vzc29yIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgYC9wcm9jZXNzb3IvYCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdlYmhvb2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb247XG59XG4vKipcbiAqIEEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gb3B0aW9ucy4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHN0YXRlbWVudHMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggc3RhdGVtZW50cyBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCBzdGF0ZW1lbnRzIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9ucyBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZS4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgb25seSB0aGUgcGVuZGluZyBiYWxhbmNlIHRoYXQgaXMgZHVlIGJlZm9yZSB0aGUgYHZpcnR1YWxfdGltZXN0YW1wYCBvbiB0aGUgdGVzdCBjbG9jayB3aWxsIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGByZWZ1bmQucG9zdGVkYCwgYHJlZnVuZC5zZXR0bGVkYCwgYHJlZnVuZC5mYWlsZWRgLCBvciBgcmVmdW5kLnJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcmVmdW5kIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQuZmFpbGVkYCAgYHJlZnVuZC5wZW5kaW5nYCAtLT4gYHJlZnVuZC5wb3N0ZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQucmV0dXJuZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQuc2V0dGxlZGAgIGByZWZ1bmQucG9zdGVkYCBldmVudHMgY2FuIG9ubHkgYmUgc2ltdWxhdGVkIGlmIHRoZSByZWZ1bmRlZCB0cmFuc2ZlciBoYXMgYmVlbiB0cmFuc2l0aW9uZWQgdG8gc2V0dGxlZC4gVGhpcyBtaW1pY3MgdGhlIG9yZGVyaW5nIG9mIGV2ZW50cyBpbiBQcm9kdWN0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBgZnVuZHNfYXZhaWxhYmxlYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmZXIgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHBlbmRpbmdgIC0tPiBgZmFpbGVkYCAgYHBlbmRpbmdgIC0tPiBgcG9zdGVkYCAgYHBvc3RlZGAgLS0+IGByZXR1cm5lZGAgIGBwb3N0ZWRgIC0tPiBgc2V0dGxlZGAgIGBzZXR0bGVkYCAtLT4gYGZ1bmRzX2F2YWlsYWJsZWAgKG9ubHkgYXBwbGljYWJsZSB0byBBQ0ggZGViaXRzLikgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBzd2VlcCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBvbiB0aGUgZGF5IG9mIHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgYHRlc3RfY2xvY2tgLiBJZiB0aGUgZGF0ZSBvZiBgdmlydHVhbF90aW1lYCBpcyBvbiB3ZWVrZW5kIG9yIGEgZmVkZXJhbCBob2xpZGF5LCB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaXMgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpbXVsYXRlZFRyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwPzogU2ltdWxhdGVkVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRpbWVzdGFtcCB3aWxsIGJlIHVzZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrczogQXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBiZSByZXNldC4gIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gcmVzZXR0aW5nIGFsbCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbmRpY2F0b3IgZm9yIHdoZW4gc2NvcGVzIGFyZSBiZWluZyB1cGRhdGVkLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCB2aWEgZW5yb2xsbWVudCAoaS5lLiBPQXV0aCksIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgRU5ST0xMTUVOVGAuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGluIGEgcG9zdC1lbnJvbGxtZW50IHZpZXcsIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgUE9SVEFMYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNjb3Blc0NvbnRleHQge1xuICAgIEVucm9sbG1lbnQgPSAnRU5ST0xMTUVOVCcsXG4gICAgUG9ydGFsID0gJ1BPUlRBTCdcbn1cblxuLyoqXG4gKiBUaGUgc2NvcGVzIG9iamVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY29wZXNOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcm9kdWN0X2FjY2Vzcz86IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBY2Nlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgd2h5IGEgc2NyZWVuaW5nIGhpdCBtYXRjaGVkIHRoZSBwcm92aWRlZCB1c2VyIGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVzX29mX2JpcnRoPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZXM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gc2NyZWVuaW5nIGhpdHMgYXJlIGltbXV0YWJsZSBvbmNlIHRoZXkgaGF2ZSBiZWVuIHJldmlld2VkLiBJZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBkdWUgdG8gdXBkYXRlcyB0byB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIHNjcmVlbmluZyBoaXQgd2lsbCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhvc2UgY2hhbmdlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtc192ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRGF0ZXMgb2YgYmlydGggYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IEFycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT47XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZGF0ZSBvZiBiaXJ0aCBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGVSYW5nZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgZGF0YT86IERhdGVSYW5nZTtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQ7XG59XG4vKipcbiAqIEFuYWx5emVkIG5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGluZGl2aWR1YWwgc2NyZWVuaW5nIHN0YXR1cyBoYXMgY2hhbmdlZCwgd2hpY2ggY2FuIG9jY3VyIG1hbnVhbGx5IHZpYSB0aGUgZGFzaGJvYXJkIG9yIGR1cmluZyBvbmdvaW5nIG1vbml0b3JpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTQ1JFRU5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc2VjdXJpdHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGN1c2lwOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2Vkb2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBnaXZlbiB0byB0aGUgc2VjdXJpdHkgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWRgIGlzIHByZXNlbnQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBQbGFpZCBgaW5zdGl0dXRpb25faWRgIG9mIHRoZSBpbnN0aXR1dGlvbiB0byB3aG9tIHRoZSBpZGVudGlmaWVyIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCBQbGFpZCB3aWxsIHByb3ZpZGUgdGhlIElEIG9mIGFub3RoZXIgc2VjdXJpdHkgd2hvc2UgcGVyZm9ybWFuY2UgcmVzZW1ibGVzIHRoaXMgc2VjdXJpdHksIHR5cGljYWxseSB3aGVuIHRoZSBvcmlnaW5hbCBzZWN1cml0eSBoYXMgbG93IHZvbHVtZSwgb3Igd2hlbiBhIHByaXZhdGUgc2VjdXJpdHkgY2FuIGJlIG1vZGVsZWQgd2l0aCBhIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHByb3h5X3NlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgYSBzZWN1cml0eSBpcyBhIGhpZ2hseSBsaXF1aWQgYXNzZXQgYW5kIGNhbiBiZSB0cmVhdGVkIGxpa2UgY2FzaC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc19jYXNoX2VxdWl2YWxlbnQ6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiAgSW4gcmFyZSBpbnN0YW5jZXMsIGEgbnVsbCB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIGluc3RpdHV0aW9uYWwgZGF0YSBpcyBpbnN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBzZWN1cml0eSB0eXBlLiAgVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdG9yIGNsYXNzaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSwgc3VjaCBhcyBGaW5hbmNlLCBIZWFsdGggVGVjaG5vbG9neSwgZXRjLiAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMsIHBsZWFzZSByZWZlciB0byB0aGUgW1xcXCJTZWN0b3JzIGFuZCBJbmR1c3RyaWVzXFxcIiBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUw3YVhVZHFMaHhnTThxZTdoSzY3cXFLWGlVZFFxSUxwd1owTHB4dkNWbmMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdG9yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmR1c3RyeSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHksIHN1Y2ggYXMgQmlvdGVjaG5vbG9neSwgQWlybGluZXMsIGV0Yy4gIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtcXFwiU2VjdG9ycyBhbmQgSW5kdXN0cmllc1xcXCIgc3ByZWFkc2hlZXRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFMN2FYVWRxTGh4Z004cWU3aEs2N3FxS1hpVWRRcUlMcHdaMExweHZDVm5jKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluZHVzdHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcHRpb25Db250cmFjdH1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBvcHRpb25fY29udHJhY3Q6IE9wdGlvbkNvbnRyYWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rml4ZWRJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgZml4ZWRfaW5jb21lOiBGaXhlZEluY29tZSB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2UgW3JlcXVlc3QgSVNJTi9DVVNJUCBhY2Nlc3MgaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNpbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIFtyZXF1ZXN0IElTSU4vQ1VTSVAgYWNjZXNzIGhlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGZpZUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzTGl2ZW5lc3NDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsaXZlbmVzc19jaGVjazogU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc1xuICAgICAqL1xuICAgIGZhY2lhbF9hbmFseXNpcz86IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXMgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzZWxmaWUgYW5kIHRoZSBkb2N1bWVudCAoaWYgZG9jdW1lbnRhcnkgdmVyaWZpY2F0aW9uIGFsc28gcmFuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBvZiB0aGUgZmFjaWFsIGZlYXR1cmVzIG9mIHRoZSBzZWxmaWUgd2hlbiBjb21wYXJlZCB0byB0aGUgZmFjZSBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQsIGlmIG9uZSBpcyBwcmVzZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9leWU6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIHJpZ2h0X2V5ZTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICByaWdodF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBmb3JlaGVhZDogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbWlkZGxlX2ZvcmVoZWFkOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBub3NlOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaGlsdHJ1bTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbW91dGg6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIGphdzogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9jaGVlazogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgcmlnaHRfY2hlZWs6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xufVxuLyoqXG4gKiBPdXRjb21lIG9mIHRoZSBmYWNpYWwgYW5hbHlzaXMgZm9yIGEgc3BlY2lmaWMgZmFjaWFsIGZlYXR1cmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFzc2Vzc21lbnQgb2Ygd2hldGhlciB0aGUgc2VsZmllIGNhcHR1cmUgaXMgb2YgYSByZWFsIGh1bWFuIGJlaW5nLCBhcyBvcHBvc2VkIHRvIGEgcGljdHVyZSBvZiBhIGh1bWFuIG9uIGEgc2NyZWVuLCBhIHBpY3R1cmUgb2YgYSBwYXBlciBjdXQgb3V0LCBzb21lb25lIHdlYXJpbmcgYSBtYXNrLCBvciBhIGRlZXBmYWtlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogVGhlIGltYWdlIG9yIHZpZGVvIGNhcHR1cmUgb2YgYSBzZWxmaWUuIE9ubHkgb25lIG9mIGltYWdlIG9yIHZpZGVvIFVSTCB3aWxsIGJlIHBvcHVsYXRlZCBwZXIgc2VsZmllLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDYXB0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYW4gaW1hZ2Ugc2VsZmllIGNhcHR1cmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2FwdHVyZVxuICAgICAqL1xuICAgIGltYWdlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIGZvciBkb3dubG9hZGluZyBhIHZpZGVvIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICB2aWRlb191cmw6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMuc2VsZmllX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZUNoZWNrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHNlbGZpZXMgc3VibWl0dGVkIHRvIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VsZmllQ2hlY2tTZWxmaWU+fVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1xuICAgICAqL1xuICAgIHNlbGZpZXM6IEFycmF5PFNlbGZpZUNoZWNrU2VsZmllPjtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYW5kIGFuYWx5c2lzIGZyb20gYSB1c2VyXFwncyBzZWxmaWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrU2VsZmllXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IHNlbGZpZSB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNhcHR1cmV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgY2FwdHVyZTogU2VsZmllQ2FwdHVyZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYW5hbHlzaXM6IFNlbGZpZUFuYWx5c2lzO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnNlbGZpZV9jaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVDaGVja1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIHNlbGZpZS4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgc2VsZmllX2NoZWNrLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIHNlbGZpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJBQ1MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhpcyByZWNpcGllbnQgbmVlZHMgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQkFDUyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbCB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlckFkZHJlc3NEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IGRlY2lzaW9uIGZyb20gdGhlIHJpc2sgYXNzZXNzbWVudC4gIGBBUFBST1ZFYDogYXBwcm92ZSB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZXF1aXJpbmcgZnVydGhlciBhY3Rpb25zIGZyb20geW91ciBjdXN0b21lcnMuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgYXJlIHBsYWNpbmcgYSBzdGFuZGFyZCBob2xkIGZvciBhbGwgdGhlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gWW91IHNob3VsZCBhbHNvIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBkZWNpZGUgdG8gYWNjZWxlcmF0ZSB0aGUgZnVuZCBhdmFpbGFiaWxpdHkgZm9yIHlvdXIgY3VzdG9tZXJzLiAgYFJFVklFV2A6IHRoZSB0cmFuc2FjdGlvbiByZXF1aXJlcyBtYW51YWwgcmV2aWV3ICBgUkVKRUNUYDogcmVqZWN0IHRoZSB0cmFuc2FjdGlvbiAgYFRBS0VfT1RIRVJfUklTS19NRUFTVVJFU2A6IGZvciBleGFtcGxlLCBwbGFjaW5nIGEgbG9uZ2VyIGhvbGQgb24gZnVuZHMgdGhhbiB0aG9zZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgb3IgaW50cm9kdWNpbmcgY3VzdG9tZXIgZnJpY3Rpb25zIHN1Y2ggYXMgc3RlcC11cCB2ZXJpZmljYXRpb24vYXV0aGVudGljYXRpb24gIGBOT1RfRVZBTFVBVEVEYDogaWYgb25seSBsb2dnaW5nIHRoZSBTaWduYWwgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gIFBvc3NpYmxlIHZhbHVlczogIGBBUFBST1ZFYCwgYFJFVklFV2AsIGBSRUpFQ1RgLCBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYCwgYE5PVF9FVkFMVUFURURgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWF0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFjdHVhbCBudW1iZXIgb2YgZGF5cyAoaG9sZCB0aW1lKSBzaW5jZSB0aGUgQUNIIGRlYml0IHRyYW5zYWN0aW9uIHRoYXQgeW91IHdhaXQgYmVmb3JlIG1ha2luZyBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMuIFRoZSBob2xkaW5nIHRpbWUgY291bGQgYWZmZWN0IHRoZSBBQ0ggcmV0dXJuIHJhdGUuICBGb3IgZXhhbXBsZSwgdXNlIDAgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBvciB0aGUgc2FtZSBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbiwgb3IgMSBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdGhlIG5leHQgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19mdW5kc19vbl9ob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGVjaXNpb25PdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9vdXRjb21lPzogU2lnbmFsRGVjaXNpb25PdXRjb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGF5bWVudE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q/OiBTaWduYWxQYXltZW50TWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IChpbiBVU0QpIG1hZGUgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLiBJdCBjb3VsZCBiZSBhIHBhcnRpYWwgYW1vdW50IG9mIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24gKGV4YW1wbGU6IDEwMi4wNSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50X2luc3RhbnRseV9hdmFpbGFibGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBkZXZpY2UuIFdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9zaWduYWwvcHJvY2Vzc29yL2V2YWx1YXRlYCwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiBTaWduYWwgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuIFxcXCJNb3ppbGxhLzUuMFxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjb3JlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6ICBgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uYDogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXMgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgYGlzX3NhdmluZ3Nfb3JfbW9uZXlfbWFya2V0X2FjY291bnRgOiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnQgIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IFNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgd2l0aGluIHRoZSBwYXN0IDkwIGRheXMgd2hlbiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBoYWQgYSBuZWdhdGl2ZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZhaWxhYmxlIGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3VycmVudF9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGJhbGFuY2VfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMzAgZGF5cyAobWF4IDEwMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgOTAgZGF5cyAobWF4IDEwMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgU1NML1RMUyBjb25uZWN0aW9uIHNlc3Npb25zIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBiYW5rIGFjY291bnQgd2FzIG9wZW5lZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXSgvZG9jcy9saW5rL2lvcy8jbGluay1pb3Mtb25zdWNjZXNzLWxpbmtTdWNjZXNzLW1ldGFkYXRhLWFjY291bnRzLWlkKSBjYWxsYmFjayBtZXRhZGF0YS4gIFRoaXMgd2lsbCByZXR1cm4gYW4gW2BJTlZBTElEX0FDQ09VTlRfSURgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1pbnB1dC8jaW52YWxpZF9hY2NvdW50X2lkKSBlcnJvciBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIGF0IHRoZSBiYW5rIG9yIGlmIHRoZSBgYWNjb3VudF9pZGAgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBlbmQgdXNlciBpcyBwcmVzZW50IHdoaWxlIGluaXRpYXRpbmcgdGhlIEFDSCB0cmFuc2ZlciBhbmQgdGhlIGVuZHBvaW50IGlzIGJlaW5nIGNhbGxlZDsgYGZhbHNlYCBvdGhlcndpc2UgKGZvciBleGFtcGxlLCB3aGVuIHRoZSBBQ0ggdHJhbnNmZXIgaXMgc2NoZWR1bGVkIGFuZCB0aGUgZW5kIHVzZXIgaXMgbm90IHByZXNlbnQsIG9yIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgdGhlIEFDSCB0cmFuc2ZlciBidXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIE5hY2hhIGZpbGUgZm9yIEFDSCBwcm9jZXNzaW5nKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBJdGVtcy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHJlY3VycmluZyB0cmFuc2FjdGlvbjsgYGZhbHNlYCBvdGhlcndpc2UgXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOQUNIQS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSBgUkVBTF9USU1FX1BBWU1FTlRTYDogcmVhbC10aW1lIHBheW1lbnRzIHN1Y2ggYXMgUlRQIGFuZCBGZWROb3cgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHJpc2tfcHJvZmlsZV9rZXlgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBydWxlc2V0YCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlX2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgUnVsZXNldCB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFlvdSBjYW4gY29uZmlndXJlIGEgUnVsZXNldCB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBub3QgcHJvdmlkZWQsIG5vIFJ1bGVzZXQgd2lsbCBiZSB1c2VkLiBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBydWxlc2V0X2tleT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY29yZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29yZXM6IFNpZ25hbFNjb3JlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrUHJvZmlsZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlPzogUmlza1Byb2ZpbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSdWxlc2V0fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZXNldD86IFJ1bGVzZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBhZnRlciB0aGUgcmlzayBhc3Nlc3NtZW50LiBJdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgcGF5bWVudCBtZXRob2QuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSAgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgIGBTVEFOREFSRF9BQ0hgOiBzdGFuZGFyZCBBQ0ggYnkgTkFDSEEgIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyAgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyAgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciB0aGVyZSBhcmUgbXVsdGlwbGUgcGF5bWVudCBtZXRob2RzICBQb3NzaWJsZSB2YWx1ZXM6IGBTQU1FX0RBWV9BQ0hgLCBgTkVYVF9EQVlfQUNIYCwgYFNUQU5EQVJEX0FDSGAsIGBSRUFMX1RJTUVfUEFZTUVOVFNgLCBgREVCSVRfQ0FSRGAsIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsUGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIE5leHREYXlBY2ggPSAnTkVYVF9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIFJlYWxUaW1lUGF5bWVudHMgPSAnUkVBTF9USU1FX1BBWU1FTlRTJyxcbiAgICBEZWJpdENhcmQgPSAnREVCSVRfQ0FSRCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHByZWZpeCAoZS5nLiBcXFwiTXIuXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgcHJlZml4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZ2l2ZW4gbmFtZS4gSWYgdGhlIHVzZXIgaGFzIGEgb25lLXdvcmQgbmFtZSwgaXQgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZhbWlseSBuYW1lIC8gc3VybmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgc3VmZml4IChlLmcuIFxcXCJJSVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXR1cm5zIGZyb20geW91ciBwYXltZW50IHByb2Nlc3NvcnMsIGluIElTTyA4NjAxIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybmVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJpc2sgc2NvcmluZyBkZXRhaWxzIGJyb2tlbiBkb3duIGJ5IHJpc2sgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjb3Jlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjb3JlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0N1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2s/OiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzaztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXIgaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gKGkuZS4sIHRoZSBhY2NvdW50IGhvbGRlcikuIFdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9zaWduYWwvcHJvY2Vzc29yL2V2YWx1YXRlYCwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiBTaWduYWwgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFVzZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQZXJzb25OYW1lfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgbmFtZT86IFNpZ25hbFBlcnNvbk5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIENvbnZleXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIG1pc3Npbmcgb3Igc3RhbGUgYmFuayBkYXRhIHVzZWQgdG8gY29uc3RydWN0IHRoZSAvc2lnbmFsL2V2YWx1YXRlIHNjb3JlcyBhbmQgcmVzcG9uc2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSBTaWduYWwgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2FybmluZyB0eXBlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN3ZWVwIHJldHVybmVkIGZyb20gdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQuIENhbiBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyB0cmFuc2ZlcnMgdG8gaW5jbHVkZSBpbiBhIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFN3ZWVwRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGFsbCByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZTogUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeTogRG9jdW1lbnRSaXNrU3VtbWFyeTtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hldGhlciBhIGRhc2hib2FyZCB1c2VyLCBhbiBBUEktYmFzZWQgdXNlciwgb3IgUGxhaWQgbGFzdCB0b3VjaGVkIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBMaW5rID0gJ2xpbmsnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLiBGb3IgYSBtYXBwaW5nIG9mIHN1cHBvcnRlZCB0eXBlcyBhbmQgc3VidHlwZXMgdG8gUGxhaWQgcHJvZHVjdHMsIHNlZSB0aGUgW0FjY291bnQgdHlwZSAvIHByb2R1Y3Qgc3VwcG9ydCBtYXRyaXhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtLXByb2R1Y3Qtc3VwcG9ydC1tYXRyaXgpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY3JlZGl0IGNhcmQgdHlwZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGNyZWRpdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbG9hbiB0eXBlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgbG9hbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGludmVzdG1lbnQgYWNjb3VudC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgdHlwZSBpcyBjYWxsZWQgYGJyb2tlcmFnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgaW52ZXN0bWVudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE90aGVyIG9yIHVua25vd24gYWNjb3VudCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIG90aGVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgY3VycmVuY3kgY29kZXMgYXJlIHN1cHBvcnRlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdCB7XG4gICAgLyoqXG4gICAgICogUGxhaWQgc3VwcG9ydHMgYWxsIElTTyA0MjE3IGN1cnJlbmN5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCB2YWx1ZXMgZm9yIGludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLiBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIHJlcHJlc2VudGluZyBpbmZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBuZWdhdGl2ZSBhbW91bnRzLCBvdXRmbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgcG9zaXRpdmUgYW1vdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgICogQnV5aW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGJ1eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNlbGxpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgc2VsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY2FuY2VsbGF0aW9uIG9mIGEgcGVuZGluZyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FuY2VsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhc2g6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGZWVzIG9uIHRoZSBhY2NvdW50LCBlLmcuIGNvbW1pc3Npb24sIGJvb2trZWVwaW5nLCBvcHRpb25zLXJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBmZWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X29mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3VidHlwZSBvZiB0aGUgYWNjb3VudC4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudC4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Ygc3RhdGVtZW50c1xcJyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzU3RhdGVtZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzOiBBcnJheTxTdGF0ZW1lbnRzU3RhdGVtZW50Pjtcbn1cbi8qKlxuICogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RhdGVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8U3RhdGVtZW50c0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IHJlZnJlc2ggZXh0cmFjdGlvbiAgYFNVQ0NFU1NgOiBUaGUgc3RhdGVtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgYW5kIGNhbiBiZSBsaXN0ZWQgdmlhIGAvc3RhdGVtZW50cy9saXN0L2AgYW5kIGRvd25sb2FkZWQgdmlhIGAvc3RhdGVtZW50cy9kb3dubG9hZC9gLiAgYEZBSUxVUkVgOiBUaGUgc3RhdGVtZW50cyBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiByZWZyZXNoZWQgc3RhdGVtZW50cyBleHRyYWN0aW9uIGlzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYmUgY29tcGxldGVkLiBUcmlnZ2VyZWQgYnkgY2FsbGluZyBgL3N0YXRlbWVudHMvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTVEFURU1FTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMy0wOC0zMFxcXCIuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTW9udGggb2YgdGhlIHllYXIuIFBvc3NpYmxlIHZhbHVlczogMSB0aHJvdWdoIDEyIChKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBtb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIG9mIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgeWVhcjogbnVtYmVyO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogU2F0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLiBFYWNoIGFjY291bnQgY2FuIG9ubHkgY29udGFpbiBvbmUgbGlhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIGFuZCBOYXZpZW50IChgaW5zXzExNjI0OGApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbl9zY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBgYWNjb3VudF9udW1iZXIsYCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnLFxuICAgIFBlbmRpbmdJZHIgPSAncGVuZGluZyBpZHInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEluY29tZVNlbnNpdGl2ZVJlcGF5bWVudCA9ICdpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudCcsXG4gICAgSW50ZXJlc3RPbmx5ID0gJ2ludGVyZXN0LW9ubHknLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXlBc1lvdUVhcm4gPSAncGF5IGFzIHlvdSBlYXJuJyxcbiAgICBSZXZpc2VkUGF5QXNZb3VFYXJuID0gJ3JldmlzZWQgcGF5IGFzIHlvdSBlYXJuJyxcbiAgICBTdGFuZGFyZCA9ICdzdGFuZGFyZCcsXG4gICAgU2F2aW5nT25BVmFsdWFibGVFZHVjYXRpb24gPSAnc2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBzdGF0dXMgZm9yIGEgc3dlZXAgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTd2VlcEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBzd2VlcCBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3dlZXBGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN3ZWVwRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN3ZWVwIHRyYW5zZmVyICBgXFxcInBlbmRpbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjdXJyZW50bHkgcGVuZGluZyBgXFxcInBvc3RlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBiZWVuIHBvc3RlZCBgXFxcInNldHRsZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgc2V0dGxlZCBgXFxcInJldHVybmVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGJlZW4gcmV0dXJuZWQgYFxcXCJmYWlsZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgZmFpbGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTd2VlcFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHRyaWdnZXIgb2YgdGhlIHN3ZWVwICBgXFxcIm1hbnVhbFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIGN1c3RvbWVyIGBcXFwiaW5jb21pbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGluY29taW5nIGZ1bmRzIGZsb3cgKGUuZy4gSW5jb21pbmcgV2lyZSkgYFxcXCJiYWxhbmNlX3RocmVzaG9sZFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgYmFsYW5jZSB0aHJlc2hvbGQgc2V0dGluZyBgXFxcImF1dG9tYXRpY19hZ2dyZWdhdGVcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IHRoZSBQbGFpZCBhdXRvbWF0aWMgYWdncmVnYXRpb24gcHJvY2Vzcy4gVGhlc2UgZnVuZHMgZGlkIG5vdCBwYXNzIHRocm91Z2ggdGhlIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBUcmlnZ2VyIHtcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgICBJbmNvbWluZyA9ICdpbmNvbWluZycsXG4gICAgQmFsYW5jZVRocmVzaG9sZCA9ICdiYWxhbmNlX3RocmVzaG9sZCcsXG4gICAgQXV0b21hdGljQWdncmVnYXRlID0gJ2F1dG9tYXRpY19hZ2dyZWdhdGUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IGFzIGl0IHdvdWxkIGluIFByb2R1Y3Rpb24uIEl0IGNhbiBhbHNvIGJlIG1hbnVhbGx5IHRyaWdnZXJlZCBpbiBTYW5kYm94IGJ5IGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluaXRpYWwgcHVsbCBpbmZvcm1hdGlvbiAobW9zdCByZWNlbnQgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGluaXRpYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBoaXN0b3JpY2FsIHB1bGwgaW5mb3JtYXRpb24gKG1heGltdW0gdHJhbnNhY3Rpb24gaGlzdG9yeSByZXF1ZXN0ZWQsIHVwIHRvIDIgeWVhcnMpIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmllbGQgY29udGFpbmluZyB0aGUgZGF0YSB1c2VkIGluIGRldGVybWluaW5nIHRoZSBvdXRjb21lIG9mIGEgc3ludGhldGljIGZyYXVkIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN5bnRoZXRpY0ZyYXVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhldGljRnJhdWQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFN5bnRoZXRpY0ZyYXVkXG4gICAgICovXG4gICAgcmlza19sZXZlbDogUmlza0xldmVsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IGFuIG9mZmljaWFsIGRvY3VtZW50IHVzZWQgdG8gcmVwb3J0IHRoZSB1c2VyXFwncyBpbmNvbWUgdG8gdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4Zm9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheGZvcm0ge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGF4IGRvY3VtZW50LiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgdzJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1cyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgdzI/OiBXMjtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklEXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJRCB7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMYXN0IDQgZGlnaXRzIG9mIHVuaXF1ZSBudW1iZXIgb2YgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGFzdF80X2RpZ2l0cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LkluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJUeXBlOiBUYXhwYXllcklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRheHBheWVyIGlkZW50aWZpZXIgYXMgYXNzaWduZWQgYnkgdGhlIElSUyB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyXG4gICAgICovXG4gICAgVGF4cGF5ZXJJZGVudGlmaWVyVmFsdWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IGNsYXNzaWZpZXMgaWRlbnRpZmljYXRpb24gbnVtYmVycyB1c2VkIGJ5IHRoZSBJbnRlcm5hbCBSZXZlbnVlIFNlcnZpY2UgKElSUykgaW4gdGhlIGFkbWluaXN0cmF0aW9uIG9mIHRheCBsYXdzLiBBIFNvY2lhbCBTZWN1cml0eSBudW1iZXIgKFNTTikgaXMgaXNzdWVkIGJ5IHRoZSBTU0E7IGFsbCBvdGhlciB0YXhwYXllciBpZGVudGlmaWNhdGlvbiBudW1iZXJzIGFyZSBpc3N1ZWQgYnkgdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRheHBheWVySWRlbnRpZmllclR5cGUge1xuICAgIEluZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyID0gJ0luZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyJyxcbiAgICBTb2NpYWxTZWN1cml0eU51bWJlciA9ICdTb2NpYWxTZWN1cml0eU51bWJlcidcbn1cblxuLyoqXG4gKiBUaGUgY29sbGVjdGlvbiBvZiBUQVhQQVlFUl9JREVOVElGSUNBVElPTiBlbGVtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyc1xuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVI6IFRheHBheWVySWRlbnRpZmllcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGEgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgdGltZSBwZXJpb2Qgb2YgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDMwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCA2MCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgOTAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCBhYm91dCB0aGUgdG90YWwgbW9udGhseSBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIGZvciB0aGUgMzAgZGF5cyBwcmlvciB0byBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsTW9udGhseUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIG9mIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIHRpbWUgcGVyaW9kIG9mIHRoZSByZXBvcnQuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCAzMCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50MzBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgNjAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDkwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgIE5vdGU6IFRoaXMgaXMgYSBsZWdhY3kgZmllbGQgdGhhdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZC4gVXNlIGBtZXJjaGFudF9uYW1lYCBpbnN0ZWFkIGZvciB0aGUgbWVyY2hhbnQgbmFtZS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBpZiB0aGUgY2xpZW50IGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBwcm92aWRlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLiBBIHN1Yi1hY2NvdW50IG1vc3QgY29tbW9ubHkgZXhpc3RzIGluIGNhc2VzIHdoZXJlIGEgc2luZ2xlIGFjY291bnQgaXMgbGlua2VkIHRvIG11bHRpcGxlIGNhcmRzLCBlYWNoIHdpdGggaXRzIG93biBjYXJkIG51bWJlciBhbmQgY2FyZCBob2xkZXIgbmFtZTsgZWFjaCBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZCBhIHN1Yi1hY2NvdW50LiBJZiB0aGUgYWNjb3VudCBkb2VzIGhhdmUgc3ViLWFjY291bnRzLCB0aGlzIGZpZWxkIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWUgY29tYmluYXRpb24gb2YgdGhlIHN1Yi1hY2NvdW50IG93bmVyXFwncyBuYW1lIGFuZC9vciB0aGUgc3ViLWFjY291bnQgbWFzay4gVGhlIGZvcm1hdCBvZiB0aGlzIGZpZWxkIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kIHdpbGwgdmFyeSBiYXNlZCBvbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuIEluIHRoZSBjYXNlIG9mIGEgbWVyY2hhbnQgd2l0aCBtdWx0aXBsZSByZXRhaWwgbG9jYXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBicm9hZGVyIG1lcmNoYW50LCBub3QgYSBzcGVjaWZpYyBsb2NhdGlvbiBvciBzdG9yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LiBJbiB0aGUgY2FzZSBvZiBhIG1lcmNoYW50IHdpdGggbXVsdGlwbGUgcmV0YWlsIGxvY2F0aW9ucywgdGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYnJvYWRlciBtZXJjaGFudCwgbm90IGEgc3BlY2lmaWMgbG9jYXRpb24gb3Igc3RvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICAgTm90ZTogVGhpcyBpcyBhIGxlZ2FjeSBmaWVsZCB0aGF0IGlzIG5vdCBhY3RpdmVseSBtYWludGFpbmVkLiBVc2UgYG1lcmNoYW50X25hbWVgIGluc3RlYWQgZm9yIHRoZSBtZXJjaGFudCBuYW1lLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGluY2x1ZGVkIGlmIHRoZSBjbGllbnQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuIEEgc3ViLWFjY291bnQgbW9zdCBjb21tb25seSBleGlzdHMgaW4gY2FzZXMgd2hlcmUgYSBzaW5nbGUgYWNjb3VudCBpcyBsaW5rZWQgdG8gbXVsdGlwbGUgY2FyZHMsIGVhY2ggd2l0aCBpdHMgb3duIGNhcmQgbnVtYmVyIGFuZCBjYXJkIGhvbGRlciBuYW1lOyBlYWNoIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkIGEgc3ViLWFjY291bnQuIElmIHRoZSBhY2NvdW50IGRvZXMgaGF2ZSBzdWItYWNjb3VudHMsIHRoaXMgZmllbGQgd2lsbCB0eXBpY2FsbHkgYmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgc3ViLWFjY291bnQgb3duZXJcXCdzIG5hbWUgYW5kL29yIHRoZSBzdWItYWNjb3VudCBtYXNrLiBUaGUgZm9ybWF0IG9mIHRoaXMgZmllbGQgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgd2lsbCB2YXJ5IGJhc2VkIG9uIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBBbiBpZGVudGlmaWVyIGNsYXNzaWZ5aW5nIHRoZSB0cmFuc2FjdGlvbiB0eXBlLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhLCB0aGlzIGZpZWxkIGlzIHNldCB0byBgbnVsbGAuICBgYWRqdXN0bWVudDpgIEJhbmsgYWRqdXN0bWVudCAgYGF0bTpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsIHZpYSBhbiBhdXRvbWF0ZWQgdGVsbGVyIG1hY2hpbmUgIGBiYW5rIGNoYXJnZTpgIENoYXJnZSBvciBmZWUgbGV2aWVkIGJ5IHRoZSBpbnN0aXR1dGlvbiAgYGJpbGwgcGF5bWVudGA6IFBheW1lbnQgb2YgYSBiaWxsICBgY2FzaDpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsICBgY2FzaGJhY2s6YCBDYXNoIHdpdGhkcmF3YWwgd2hpbGUgbWFraW5nIGEgZGViaXQgY2FyZCBwdXJjaGFzZSAgYGNoZXF1ZTpgIERvY3VtZW50IG9yZGVyaW5nIHRoZSBwYXltZW50IG9mIG1vbmV5IHRvIGFub3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiAgYGRpcmVjdCBkZWJpdDpgIEF1dG9tYXRpYyB3aXRoZHJhd2FsIG9mIGZ1bmRzIGluaXRpYXRlZCBieSBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYGludGVyZXN0OmAgSW50ZXJlc3QgZWFybmVkIG9yIGluY3VycmVkICBgcHVyY2hhc2U6YCBQdXJjaGFzZSBtYWRlIHdpdGggYSBkZWJpdCBvciBjcmVkaXQgY2FyZCAgYHN0YW5kaW5nIG9yZGVyOmAgUGF5bWVudCBpbnN0cnVjdGVkIGJ5IHRoZSBhY2NvdW50IGhvbGRlciB0byBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYHRyYW5zZmVyOmAgVHJhbnNmZXIgb2YgbW9uZXkgYmV0d2VlbiBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25Db2RlIHtcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEF0bSA9ICdhdG0nLFxuICAgIEJhbmtDaGFyZ2UgPSAnYmFuayBjaGFyZ2UnLFxuICAgIEJpbGxQYXltZW50ID0gJ2JpbGwgcGF5bWVudCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBDYXNoYmFjayA9ICdjYXNoYmFjaycsXG4gICAgQ2hlcXVlID0gJ2NoZXF1ZScsXG4gICAgRGlyZWN0RGViaXQgPSAnZGlyZWN0IGRlYml0JyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgUHVyY2hhc2UgPSAncHVyY2hhc2UnLFxuICAgIFN0YW5kaW5nT3JkZXIgPSAnc3RhbmRpbmcgb3JkZXInLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgdHlwZTogQ291bnRlcnBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNvdW50ZXJwYXJ0eSBpcyBpbnZvbHZlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBgVkVSWV9ISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY291bnRlcnBhcnR5IHdhcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBidXQgc29tZSBkZXRhaWxzIG1heSBkaWZmZXIgZnJvbSBvdXIgcmVjb3Jkcy4gYExPV2A6IFdlIGRpZG7igJl0IGZpbmQgYSBtYXRjaGluZyBjb3VudGVycGFydHkgaW4gb3VyIHJlY29yZHMsIHNvIHdlIGFyZSByZXR1cm5pbmcgYSBjbGVhbnNlZCBuYW1lIHBhcnNlZCBvdXQgb2YgdGhlIHJlcXVlc3QgZGVzY3JpcHRpb24uIGBVTktOT1dOYDogV2UgZG9u4oCZdCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2hlZCBkaXJlY3QgZGVwb3NpdCB0cmFuc2FjdGlvbiB1c2VkIHRvIHZlcmlmeSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIHRvIHBvcHVsYXRlIGFzIHRlc3QgdHJhbnNhY3Rpb24gZGF0YS4gSWYgbm90IHNwZWNpZmllZCwgcmFuZG9tIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBUcmFuc2FjdGlvbnMgaW4gU2FuZGJveCB3aWxsIG1vdmUgZnJvbSBwZW5kaW5nIHRvIHBvc3RlZCBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGRhdGUgaGFzIGJlZW4gcmVhY2hlZC4gSWYgYSBgZGF0ZV90cmFuc2FjdGVkYCBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBhIHRyYW5zYWN0aW9uIGRhdGUgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgW2BhdXRob3JpemVkX2RhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9ucy1nZXQtcmVzcG9uc2UtdHJhbnNhY3Rpb25zLWF1dGhvcml6ZWQtZGF0ZSkgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFBvc3RlZCBkYXRlcyBpbiB0aGUgcGFzdCBvciBwcmVzZW50IHdpbGwgcmVzdWx0IGluIHBvc3RlZCB0cmFuc2FjdGlvbnM7IHBvc3RlZCBkYXRlcyBpbiB0aGUgZnV0dXJlIHdpbGwgcmVzdWx0IGluIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIENhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogQSBncm91cGluZyBvZiByZWxhdGVkIHRyYW5zYWN0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIHN0cmVhbSBiZWxvbmdzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBzdHJlYW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZmlyc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGRhdGUgb2YgdGhlIG5leHQgcGF5bWVudC4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBuZXh0IHBheW1lbnQgZGF0ZSBjYW4gYmUgcHJlZGljdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgcHJlZGljdGVkX25leHRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeTogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbW9kaWZpZWQgYnkgcmVxdWVzdCB0byBhIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zYCBlbmRwb2ludC4gSXQgd2lsbCBiZSBgZmFsc2VgIGZvciBhbGwgb3RoZXIgc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc191c2VyX21vZGlmaWVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB1c2VyIG1vZGlmaWNhdGlvbi4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIGBpc191c2VyX21vZGlmaWVkYCBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X3VzZXJfbW9kaWZpZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIGRhdGEgcGVydGFpbmluZyB0byBhbiBhbW91bnQgb24gdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbUFtb3VudCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIGFuIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYE1BVFVSRWA6IEEgYE1BVFVSRWAgcmVjdXJyaW5nIHN0cmVhbSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHRyYW5zYWN0aW9ucyBhbmQgaGFwcGVuIG9uIGEgcmVndWxhciBjYWRlbmNlIChGb3IgQW5udWFsIHJlY3VycmluZyBzdHJlYW0sIHdlIHdpbGwgbWFyayBpdCBgTUFUVVJFYCBhZnRlciAyIGluc3RhbmNlcykuICBgRUFSTFlfREVURUNUSU9OYDogV2hlbiBhIHJlY3VycmluZyB0cmFuc2FjdGlvbiBmaXJzdCBhcHBlYXJzIGluIHRoZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGFuZCBiZWZvcmUgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IG9mIGEgbWF0dXJlIHN0cmVhbSwgdGhlIHN0YXR1cyB3aWxsIGJlIGBFQVJMWV9ERVRFQ1RJT05gLiAgYFRPTUJTVE9ORURgOiBBIHN0cmVhbSB0aGF0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBgRUFSTFlfREVURUNUSU9OYCBzdGF0dXMgd2lsbCBtb3ZlIHRvIHRoZSBgVE9NQlNUT05FRGAgc3RhdHVzIHdoZW4gbm8gZnVydGhlciB0cmFuc2FjdGlvbnMgd2VyZSBmb3VuZCBhdCB0aGUgbmV4dCBleHBlY3RlZCBkYXRlLiAgYFVOS05PV05gOiBBIHN0cmVhbSBpcyBhc3NpZ25lZCBhbiBgVU5LTk9XTmAgc3RhdHVzIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgc3RhdHVzZXMgYXJlIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBNYXR1cmUgPSAnTUFUVVJFJyxcbiAgICBFYXJseURldGVjdGlvbiA9ICdFQVJMWV9ERVRFQ1RJT04nLFxuICAgIFRvbWJzdG9uZWQgPSAnVE9NQlNUT05FRCdcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25zIGNhdGVnb3J5IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcnVsZSBjcmVhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgSXRlbSB0aGUgcnVsZSB3YXMgY3JlYXRlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSBydWxlIHdhcyBjcmVhdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IHVuaXF1ZSBpZGVudGlmaWVyLiAgSW4gdGhlIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdGF4b25vbXksIHRoaXMgZmllbGQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzPzogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbnMgKGBkZXBvc2l0b3J5YCBvciBgY3JlZGl0YCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiByYXcgdHJhbnNhY3Rpb25zIHRvIGJlIGVuaGFuY2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGVuaGFuY2VkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5oYW5jZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChlaXRoZXIgYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb24gb2JqZWN0cyB0byBiZSBlbnJpY2hlZCBieSBQbGFpZC4gTWF4aW11bSBvZiAxMDAgdHJhbnNhY3Rpb25zIHBlciByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGBsZWdhY3lfY2F0ZWdvcnlgIGFuZCBgbGVnYWN5X2NhdGVnb3J5X2lkYCBpbiB0aGUgcmVzcG9uc2UgKGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCkuICBDYXRlZ29yaWVzIGFyZSBiYXNlZCBvbiBQbGFpZFxcJ3MgbGVnYWN5IHRheG9ub215LiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9sZWdhY3lfY2F0ZWdvcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbnJpY2hlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5yaWNoZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIG9ubHkgYXBwbGllcyB0byBjYWxscyBmb3IgSXRlbXMgd2hlcmUgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIChpLmUuIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuIElmIGEgdmFsdWUgdW5kZXIgMzAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAzMCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVxdWVzdC4gIElmIHRoZSBJdGVtIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QsIHRoaXMgZmllbGQgd2lsbCBoYXZlIG5vIGVmZmVjdC4gVGhlIG1heGltdW0gYW1vdW50IG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBvbiBhbiBJdGVtIGNhbm5vdCBiZSB1cGRhdGVkIGlmIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtLiBUbyByZXF1ZXN0IG9sZGVyIHRyYW5zYWN0aW9uIGhpc3Rvcnkgb24gYW4gSXRlbSB3aGVyZSBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCwgeW91IG11c3QgZGVsZXRlIHRoZSBJdGVtIHZpYSBgL2l0ZW0vcmVtb3ZlYCBhbmQgc2VuZCB0aGUgdXNlciB0aHJvdWdoIExpbmsgdG8gY3JlYXRlIGEgbmV3IEl0ZW0uICAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFN0cmVhbXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIE90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zPzogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFJldHJpZXZlcyBhbGwgYWN0aXZlIGFjY291bnRzIG9uIGl0ZW0gaWYgbm8gYGFjY291bnRfaWRgcyBhcmUgcHJvdmlkZWQuICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQge1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBmaXJzdCBzdHJlYW0uIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmV0YWluIHRoZSBzdHJlYW1faWQgb2YgdGhlIGZpcnN0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRyYW5zYWN0aW9ucyBydWxlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBwcm92aWRlIHRyYW5zYWN0aW9uX2lkLiBGb3IgTkFNRSBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBOYW1lID0gJ05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBFWEFDVF9NQVRDSCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgZGV0YWlsZWQgY2F0ZWdvcnkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGFuZCBhY2N1cmF0ZSBjYXRlZ29yaXphdGlvbi4gIFNlZSB0aGUgW2B0YXhvbm9teSBjc3YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfZGV0YWlsczogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlOiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbiBydWxlc1xuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGVzOiBBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJ1bGVcXCdzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBUaGUgY3Vyc29yIGFsc28gYWNjZXB0cyB0aGUgc3BlY2lhbCB2YWx1ZSBvZiBgXFxcIm5vd1xcXCJgLCB3aGljaCBjYW4gYmUgdXNlZCB0byBmYXN0LWZvcndhcmQgdGhlIGN1cnNvciBhcyBwYXJ0IG9mIG1pZ3JhdGluZyBhbiBleGlzdGluZyBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBzeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gTm90ZSB0aGF0IHVzaW5nIHRoZSBgXFxcIm5vd1xcXCJgIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSB1c2UgY2FzZSBvdGhlciB0aGFuIG1pZ3JhdGluZyBleGlzdGluZyBJdGVtcyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAuICBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSByYXcgdW5wYXJzZWQgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24gZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB3aGVyZSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKGkuZS4sIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgb3B0aW9uYWxfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJlcXVlc3QuICBJZiB0aGUgSXRlbSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3Qgb24gYW4gSXRlbSBjYW5ub3QgYmUgdXBkYXRlZCBpZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbS4gVG8gcmVxdWVzdCBvbGRlciB0cmFuc2FjdGlvbiBoaXN0b3J5IG9uIGFuIEl0ZW0gd2hlcmUgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIHlvdSBtdXN0IGRlbGV0ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAgYW5kIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rIHRvIGNyZWF0ZSBhIG5ldyBJdGVtLiAgIEN1c3RvbWVycyB1c2luZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHNob3VsZCByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIHJldHVybmVkIHVwZGF0ZXMgYW5kIGN1cnNvciB3aWxsIG9ubHkgcmVmbGVjdCB0aGUgc3BlY2lmaWVkIGFjY291bnRcXCdzIHRyYW5zYWN0aW9ucy4gT21pdHRpbmcgYGFjY291bnRfaWRgIHJldHVybnMgdXBkYXRlcyBmb3IgYWxsIGFjY291bnRzIHVuZGVyIHRoZSBJdGVtLiBOb3RlIHRoYXQgc3BlY2lmeWluZyBhbiBgYWNjb3VudF9pZGAgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHNlcGFyYXRlIGluY3JlbWVudGFsIHVwZGF0ZSBzdHJlYW3igJRhbmQgdGhlcmVmb3JlIGEgc2VwYXJhdGUgY3Vyc29y4oCUZm9yIHRoYXQgYWNjb3VudC4gSWYgbXVsdGlwbGUgYWNjb3VudHMgYXJlIHF1ZXJpZWQgdGhpcyB3YXksIHlvdSB3aWxsIG1haW50YWluIG11bHRpcGxlIGN1cnNvcnMsIG9uZSBwZXIgYGFjY291bnRfaWRgLiAgIElmIHlvdSBkZWNpZGUgdG8gYmVnaW4gZmlsdGVyaW5nIGJ5IGBhY2NvdW50X2lkYCBhZnRlciB1c2luZyBubyBgYWNjb3VudF9pZGAsIHN0YXJ0IGZyZXNoIHdpdGggYSBudWxsIGN1cnNvciBhbmQgbWFpbnRhaW4gc2VwYXJhdGUgYChhY2NvdW50X2lkLCBjdXJzb3IpYCBwYWlycyBnb2luZyBmb3J3YXJkLiBEbyBub3QgcmV1c2UgYW55IHByZXZpb3VzbHkgc2F2ZWQgY3Vyc29ycywgYXMgdGhpcyBjYW4gY2F1c2UgcGFnaW5hdGlvbiBlcnJvcnMgb3IgaW5jb21wbGV0ZSBkYXRhLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZV9zdGF0dXM6IFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50cyBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHJlc3BvbnNlLiBPbmx5IGFjY291bnRzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIHNob3duLiBGb3IgZXhhbXBsZSwgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBJZiBgYWNjb3VudF9pZGAgaXMgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QsIHRoZSByZXR1cm5lZCBjdXJzb3Igd2lsbCByZWZsZWN0IHVwZGF0ZXMgZm9yIHRoYXQgc3BlY2lmaWMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1cGRhdGUgc3RhdHVzIGZvciB0cmFuc2FjdGlvbiBwdWxscyBvZiBhbiBJdGVtLiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRyYW5zYWN0aW9ucyB3ZWJob29rcywgYW5kIG1heSBiZSBoZWxwZnVsIGZvciB3ZWJob29rIHRyb3VibGVzaG9vdGluZyBvciB3aGVuIHJlY292ZXJpbmcgZnJvbSBtaXNzZWQgd2ViaG9va3MuICBgVFJBTlNBQ1RJT05TX1VQREFURV9TVEFUVVNfVU5LTk9XTmA6IFVuYWJsZSB0byBmZXRjaCB0cmFuc2FjdGlvbnMgdXBkYXRlIHN0YXR1cyBmb3IgSXRlbS4gYE5PVF9SRUFEWWA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgdHJhbnNhY3Rpb24gcHVsbC4gYElOSVRJQUxfVVBEQVRFX0NPTVBMRVRFYDogSW5pdGlhbCBwdWxsIGZvciB0aGUgSXRlbSBpcyBjb21wbGV0ZSwgaGlzdG9yaWNhbCBwdWxsIGlzIHBlbmRpbmcuIGBISVNUT1JJQ0FMX1VQREFURV9DT01QTEVURWA6IEJvdGggaW5pdGlhbCBhbmQgaGlzdG9yaWNhbCBwdWxsIGZvciBJdGVtIGFyZSBjb21wbGV0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cyB7XG4gICAgVHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzVW5rbm93biA9ICdUUkFOU0FDVElPTlNfVVBEQVRFX1NUQVRVU19VTktOT1dOJyxcbiAgICBOb3RSZWFkeSA9ICdOT1RfUkVBRFknLFxuICAgIEluaXRpYWxVcGRhdGVDb21wbGV0ZSA9ICdJTklUSUFMX1VQREFURV9DT01QTEVURScsXG4gICAgSGlzdG9yaWNhbFVwZGF0ZUNvbXBsZXRlID0gJ0hJU1RPUklDQUxfVVBEQVRFX0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGNsaWVudC1wcm92aWRlZCB1c2VyX2lkIHRvIHJldHJpZXZlIGluc2lnaHRzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJEYXRhT3ZlcnZpZXd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9kYXRhX292ZXJ2aWV3OiBVc2VyRGF0YU92ZXJ2aWV3O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHlfaW5zaWdodHM/OiBDb3VudGVycGFydHlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F0ZWdvcnlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pbnNpZ2h0cz86IENhdGVnb3J5SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNhY3Rpb25zPzogUmVjdXJyaW5nVHJhbnNhY3Rpb25zO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgd2lyZV9kZXRhaWxzPzogVHJhbnNmZXJXaXJlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MSwgUjUyLCBSNTMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiBzZXR0bGVtZW50IHdpbGwgb2NjdXIgYmV0d2VlbiBQbGFpZCBhbmQgdGhlIHJlY2VpdmluZyBiYW5rIChSREZJKS4gRm9yIEFDSCBkZWJpdHMsIHRoaXMgaXMgdGhlIGRhdGUgZnVuZHMgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgYmFuayBhY2NvdW50IGJlaW5nIGRlYml0ZWQuIEZvciBBQ0ggY3JlZGl0cywgdGhpcyBpcyB0aGUgZGF0ZSBmdW5kcyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgYmFuayBhY2NvdW50IGJlaW5nIGNyZWRpdGVkLiBPbmx5IHNldCBmb3IgQUNIIHRyYW5zZmVyczsgYG51bGxgIGZvciBub24tQUNIIHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBGb3IgYHJ0cGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBUcmFuc2FjdGlvbiBJZGVudGlmaWNhdGlvbiBudW1iZXIuIEZvciBgd2lyZWAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBJTUFEIChJbnB1dCBNZXNzYWdlIEFjY291bnRhYmlsaXR5IERhdGEpIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgQUNIIG5ldHdvcmtzIHVzZWQgZm9yIHRoZSBmdW5kcyBmbG93LiAgRm9yIHJlcXVlc3RzIHN1Ym1pdHRlZCBhcyBlaXRoZXIgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdGhlIGN1dG9mZiBmb3Igc2FtZS1kYXkgaXMgMzozMCBQTSBFYXN0ZXJuIFRpbWUgYW5kIHRoZSBjdXRvZmYgZm9yIG5leHQtZGF5IHRyYW5zZmVycyBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc3VibWl0IGEgcmVxdWVzdCBhdCBsZWFzdCAxNSBtaW51dGVzIGJlZm9yZSB0aGUgY3V0b2ZmIHRpbWUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBjdXRvZmYuIEFueSByZXF1ZXN0IHRoYXQgaXMgaW5kaWNhdGVkIGFzIGBzYW1lLWRheS1hY2hgIGFuZCB0aGF0IG1pc3NlcyB0aGUgc2FtZS1kYXkgY3V0b2ZmLCBidXQgaXMgc3VibWl0dGVkIGluIHRpbWUgZm9yIHRoZSBuZXh0LWRheSBjdXRvZmYsIHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBQ0hOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCdcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBmb3IgYSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSByZXByZXNlbnRpbmcgd2hlbiB0aGUgYXV0aG9yaXphdGlvbiB3YXMgY3JlYXRlZCwgaW4gdGhlIGZvcm1hdCBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheW1lbnRfcmlzazogVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBwcm9wb3NlZF90cmFuc2ZlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2Zlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXF1aXJlZCBpZiBub3QgdXNpbmcgYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX2RldGFpbHM/OiBUcmFuc2ZlcldpcmVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBhdXRob3JpemF0aW9uLCB3aGljaCBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIGF1dGhvcml6YXRpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0aG9yaXphdGlvbiBpcyBjcmVhdGVkLiAgSWRlbXBvdGVuY3kgZG9lcyBub3QgYXBwbHkgdG8gYXV0aG9yaXphdGlvbnMgd2hvc2UgZGVjaXNpb25zIGFyZSBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLiBUaGVyZWZvcmUgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYGlkZW1wb3RlbmN5X2tleWAuICBUaGlzIGlkZW1wb3RlbmN5IGtleSBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLCBhZnRlciB3aGljaCB0aGUgc2FtZSBrZXkgY2FuIGJlIHJldXNlZC4gRmFpbHVyZSB0byBwcm92aWRlIHRoaXMga2V5IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgaXMgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgUGxhaWQgd2lsbCBub3Qgb2ZmZXIgYSBgZ3VhcmFudGVlX2RlY2lzaW9uYCBmb3IgdGhpcyByZXF1ZXN0IChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2l0aF9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYnkgUGxhaWRcXCdzIFtiZWFjb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvZ3VhcmFudGVlLyN1c2luZy1hLWJlYWNvbikgd2hlbiBpdCBpcyBydW4gb24geW91ciB3ZWJwYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fc2Vzc2lvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgbmVlZGVkIGlmIGNyZWF0aW5nIHRyYW5zZmVycyBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZT86IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgYXV0aG9yaXphdGlvbmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIFJ1bGVzZXQgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgYXBwcm92ZWRgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBkZWNsaW5lZGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCDigJMgQW4gYWN0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBQbGFpZCBjYW4gYXNzZXNzIHRoZSB0cmFuc2ZlciByaXNrIGFuZCBtYWtlIGEgZGVjaXNpb24uIFRoZSBtb3N0IGNvbW1vbiBzY2VuYXJpbyBpcyB0byB1cGRhdGUgYXV0aGVudGljYXRpb24gZm9yIGFuIEl0ZW0uIFRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCBhY3Rpb24sIGluaXRpYWxpemUgTGluayBieSBzZXR0aW5nIGB0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYCBpbiB0aGUgcmVxdWVzdCBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gQWZ0ZXIgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIERlY2xpbmVkID0gJ2RlY2xpbmVkJyxcbiAgICBVc2VyQWN0aW9uUmVxdWlyZWQgPSAndXNlcl9hY3Rpb25fcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHJlZ2FyZGluZyBhIHByb3Bvc2VkIHRyYW5zZmVyLiBJdCBpcyBhbHdheXMgc2V0IGZvciBgZGVjbGluZWRgIGRlY2lzaW9ucywgYW5kIG1heSBvciBtYXkgbm90IGJlIG51bGwgZm9yIGBhcHByb3ZlZGAgZGVjaXNpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zZmVyIGFwcHJvdmFsIG9yIHRyYW5zZmVyIGRlY2xpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbGUgZm9yIGFwcHJvdmluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgSWYgdGhlIGByYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgcGFzc2VkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLiAgQW55IG5vbi1gbnVsbGAgdmFsdWUgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4gYW5kIHRoYXQgeW91IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgYXNzZXNzbWVudCBvbiB0aGUgdHJhbnNmZXIuIFRoZSBjb2RlIHdpbGwgaW5kaWNhdGUgd2h5IHRoZSBjaGVjayBjb3VsZCBub3QgYmUgcnVuLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgYXJlOiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIOKAkyBJdGVtIGNyZWF0ZWQgdmlhIGEgbWFudWFsIGVudHJ5IGZsb3cgKGkuZS4gU2FtZSBEYXkgTWljcm8tZGVwb3NpdCwgSW5zdGFudCBNaWNyby1kZXBvc2l0LCBEYXRhYmFzZSBJbnNpZ2h0cywgb3IgRGF0YWJhc2UgTWF0Y2gpLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIEl0ZW0gc3RhbGVuZXNzLiBDYW4gYmUgcmVzb2x2ZWQgYnkgdXNpbmcgTGluayBhbmQgc2V0dGluZyBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGluIHRoZSByZXF1ZXN0IHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiAgYE1JR1JBVEVEX0FDQ09VTlRfSVRFTWAgLSBJdGVtIGNyZWF0ZWQgdmlhIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCwgbGltaXRlZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICBgRVJST1JgIOKAkyBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gYW4gdW5zcGVjaWZpZWQgZXJyb3IuICBUaGUgZm9sbG93aW5nIGNvZGVzIGluZGljYXRlIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gd2FzIGBkZWNsaW5lZGA6ICBgTlNGYCDigJMgVHJhbnNhY3Rpb24gbGlrZWx5IHRvIHJlc3VsdCBpbiBhIHJldHVybiBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFJJU0tgIC0gVHJhbnNhY3Rpb24gaXMgaGlnaC1yaXNrLiAgYFRSQU5TRkVSX0xJTUlUX1JFQUNIRURgIC0gT25lIG9yIHNldmVyYWwgdHJhbnNmZXIgbGltaXRzIGFyZSByZWFjaGVkLCBlLmcuIG1vbnRobHkgdHJhbnNmZXIgbGltaXQuIENoZWNrIHRoZSBhY2NvbXBhbnlpbmcgYGRlc2NyaXB0aW9uYCBmaWVsZCB0byB1bmRlcnN0YW5kIHdoaWNoIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGUge1xuICAgIE5zZiA9ICdOU0YnLFxuICAgIFJpc2sgPSAnUklTSycsXG4gICAgVHJhbnNmZXJMaW1pdFJlYWNoZWQgPSAnVFJBTlNGRVJfTElNSVRfUkVBQ0hFRCcsXG4gICAgTWFudWFsbHlWZXJpZmllZEl0ZW0gPSAnTUFOVUFMTFlfVkVSSUZJRURfSVRFTScsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgUGF5bWVudFByb2ZpbGVMb2dpblJlcXVpcmVkID0gJ1BBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIE1pZ3JhdGVkQWNjb3VudEl0ZW0gPSAnTUlHUkFURURfQUNDT1VOVF9JVEVNJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2ZlciBpcyBndWFyYW50ZWVkIGJ5IFBsYWlkIChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLiBUaGlzIGZpZWxkIHdpbGwgY29udGFpbiBlaXRoZXIgYEdVQVJBTlRFRURgIG9yIGBOT1RfR1VBUkFOVEVFRGAgaW5kaWNhdGluZyB3aGV0aGVyIFBsYWlkIHdpbGwgZ3VhcmFudGVlIHRoZSB0cmFuc2Zlci4gSWYgdGhlIHRyYW5zZmVyIGlzIG5vdCBndWFyYW50ZWVkLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhlIGBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZC4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiBgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZWAgZm9yIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB7XG4gICAgR3VhcmFudGVlZCA9ICdHVUFSQU5URUVEJyxcbiAgICBOb3RHdWFyYW50ZWVkID0gJ05PVF9HVUFSQU5URUVEJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHRvIG5vdCBndWFyYW50ZWUgYSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBndWFyYW50ZWVfZGVjaXNpb25gIGlzIGBOT1RfR1VBUkFOVEVFRGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSB0cmFuc2ZlciBjYW5ub3QgYmUgZ3VhcmFudGVlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBQbGFpZCBkZWNsaW5lZCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2ZlcjogIGBSRVRVUk5fQkFOS2A6IFRoZSByaXNrIG9mIGEgYmFuay1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYW4gUjAxL05TRikgaXMgdG9vIGhpZ2ggdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXIuICBgUkVUVVJOX0NVU1RPTUVSYDogVGhlIHJpc2sgb2YgYSBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYSBSMTAvVW5hdXRob3JpemVkKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBHVUFSQU5URUVfTElNSVRfUkVBQ0hFRGA6IFRoaXMgdHJhbnNmZXIgaXMgbG93LXJpc2ssIGJ1dCBHdWFyYW50ZWUgaGFzIGV4aGF1c3RlZCBhbiBpbnRlcm5hbCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9yIHJhdGUgb2YgZ3VhcmFudGVlcyB0aGF0IGFwcGxpZXMgdG8gdGhpcyB0cmFuc2Zlci4gIGBSSVNLX0VTVElNQVRFX1VOQVZBSUxBQkxFYDogQSByaXNrIGVzdGltYXRlIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0uICBgUkVRVUlSRURfUEFSQU1fTUlTU0lOR2A6IFJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZSB7XG4gICAgUmV0dXJuQmFuayA9ICdSRVRVUk5fQkFOSycsXG4gICAgUmV0dXJuQ3VzdG9tZXIgPSAnUkVUVVJOX0NVU1RPTUVSJyxcbiAgICBHdWFyYW50ZWVMaW1pdFJlYWNoZWQgPSAnR1VBUkFOVEVFX0xJTUlUX1JFQUNIRUQnLFxuICAgIFJpc2tFc3RpbWF0ZVVuYXZhaWxhYmxlID0gJ1JJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEUnLFxuICAgIFJlcXVpcmVkUGFyYW1NaXNzaW5nID0gJ1JFUVVJUkVEX1BBUkFNX01JU1NJTkcnXG59XG5cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgdGhlIHNjb3JlcyBhbmQgcmlzayBsZXZlbC4gVGhpcyByZXNwb25zZSBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGUuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoZXNlIGZpZWxkcyBwbGVhc2UgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgYmVjYXVzZSBhbiBhY2NvdW50IGlzIG92ZXJkcmF3biBvciBiZWNhdXNlIGFuIGluZWxpZ2libGUgYWNjb3VudCBpcyB1c2VkIGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCAgXFxcIlIwOVxcXCIsIFxcXCJSMTNcXFwiLCBcXFwiUjE2XFxcIiwgXFxcIlIxN1xcXCIsIFxcXCJSMjBcXFwiLCBcXFwiUjIzXFxcIi4gVGhlc2UgcmV0dXJucyBoYXZlIGEgdHVybmFyb3VuZCB0aW1lIG9mIDIgYmFua2luZyBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Njb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC4gIFRoZSBzY29yZSBldmFsdWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdCBhbmQgY292ZXJzIHJldHVybiBjb2RlczogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJXaXJlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHdpcmVfZGV0YWlscz86IFRyYW5zZmVyV2lyZURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IHByZXNlbnQgaWYgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVkaXRfZnVuZHNfc291cmNlOiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xufVxuLyoqXG4gKiBDb21wcmlzZXMgZml2ZSByaXNrIGNhdGVnb3JpZXMgKGhpZ2ggcmlzaywgbWVkaXVtLWhpZ2ggcmlzaywgbWVkaXVtIHJpc2ssIG1lZGl1bS1sb3cgcmlzaywgbG93IHJpc2spIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBvZiByZXR1cm5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB7XG4gICAgSGlnaFJpc2sgPSAnSElHSF9SSVNLJyxcbiAgICBNZWRpdW1IaWdoUmlzayA9ICdNRURJVU1fSElHSF9SSVNLJyxcbiAgICBNZWRpdW1SaXNrID0gJ01FRElVTV9SSVNLJyxcbiAgICBNZWRpdW1Mb3dSaXNrID0gJ01FRElVTV9MT1dfUklTSycsXG4gICAgTG93UmlzayA9ICdMT1dfUklTSydcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci4gIElmIHRoZSBhY2NvdW50IGhhcyBtdWx0aXBsZSBhY2NvdW50IGhvbGRlcnMsIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIgb24gd2hvc2UgYmVoYWxmIHRoZSBhdXRob3JpemF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhlIGB1c2VyLmxlZ2FsX25hbWVgIGZpZWxkIGlzIHJlcXVpcmVkLiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgYXJlIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuIElmIHRoZSB1c2VyIGlzIGEgYnVzaW5lc3MsIHByb3ZpZGUgdGhlIGJ1c2luZXNzIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBiYWxhbmNlLCBwbHVzIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFsYW5jZS4gIGBwcmVmdW5kZWRfcnRwX2NyZWRpdHNgIC0gWW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJCYWxhbmNlVHlwZSB7XG4gICAgUnRwQ3JlZGl0cyA9ICdwcmVmdW5kZWRfcnRwX2NyZWRpdHMnLFxuICAgIEFjaENyZWRpdHMgPSAncHJlZnVuZGVkX2FjaF9jcmVkaXRzJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN1cHBvcnRlZCBzZXJ2aWNlIHR5cGVzIGluIFJUUFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbiBzdXBwb3J0cyBSVFAgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICAgICAqL1xuICAgIGNyZWRpdD86IGJvb2xlYW47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zdXBwb3J0ZWRfbmV0d29ya3M6IEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3M7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIGNyZWRpdCB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBkb2xsYXIgYW1vdW50IG9mIGEgc2luZ2xlIGRlYml0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfZGFpbHlfY3JlZGl0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBhbmQgZGViaXQgdHJhbnNmZXJzIGluIG9uZSBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfbW9udGhseV9kZWJpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLiBgYXV0aG9yaXphdGlvbl9pZGAgaXMgbm93IHVzZWQgYXMgaWRlbXBvdGVuY3kgaW5zdGVhZC4gIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgdHJhbnNmZXIgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIFRoaXMgcGFyYW1ldGVyIGFsc28gc2VydmVzIHRoZSBwdXJwb3NlIG9mIGFjdGluZyBhcyBhbiBpZGVtcG90ZW5jeSBpZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2ZlciBkZXNjcmlwdGlvbi4gTWF4aW11bSBvZiAxNSBjaGFyYWN0ZXJzLiBJZiByZXByb2Nlc3NpbmcgYSByZXR1cm5lZCB0cmFuc2ZlciwgcGxlYXNlIG5vdGUgdGhhdCB0aGUgYGRlc2NyaXB0aW9uYCBmaWVsZCBtdXN0IGJlIGBcXFwiUmV0cnkgMVxcXCJgIG9yIGBcXFwiUmV0cnkgMlxcXCJgIHRvIGluZGljYXRlIHRoYXQgaXRcXCdzIGEgcmV0cnkgb2YgYSBwcmV2aW91c2x5IHJldHVybmVkIHRyYW5zZmVyLiBZb3UgbWF5IHJldHJ5IGEgdHJhbnNmZXIgdXAgdG8gMiB0aW1lcywgd2l0aGluIDE4MCBkYXlzIG9mIGNyZWF0aW5nIHRoZSBvcmlnaW5hbCB0cmFuc2Zlci4gT25seSB0cmFuc2ZlcnMgdGhhdCB3ZXJlIHJldHVybmVkIHdpdGggY29kZSBgUjAxYCBvciBgUjA5YCBtYXkgYmUgcmV0cmllZC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdXNlcj86IFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCBmb3IgdGhpcyB0cmFuc2Zlci4gSWYgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSBvcmlnaW5hdGlvbiBhY2NvdW50LCB0aGlzIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkLiBPdGhlcndpc2UsIHRoaXMgZmllbGQgc2hvdWxkIGJlIGxlZnQgYmxhbmsuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdXNpbmcgYHNhbmRib3hgIGVudmlyb25tZW50LiBJZiBwcm92aWRlZCwgdGhlIGB0cmFuc2ZlcmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIGB0ZXN0X2Nsb2NrYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWNpbGl0YXRvcl9mZWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgZmllbGQgaXMgbm93IGRlcHJlY2F0ZWQuIFlvdSBtYXkgaWdub3JlIGl0IGZvciB0cmFuc2ZlcnMgY3JlYXRlZCBvbiBhbmQgYWZ0ZXIgMTIvMDEvMjAyMy4gIFNwZWNpZmllcyB0aGUgc291cmNlIG9mIGZ1bmRzIGZvciB0aGUgdHJhbnNmZXIuIE9ubHkgdmFsaWQgZm9yIGBjcmVkaXRgIHRyYW5zZmVycywgYW5kIGRlZmF1bHRzIHRvIGBzd2VlcGAgaWYgbm90IHNwZWNpZmllZC4gVGhpcyBmaWVsZCBpcyBub3Qgc3BlY2lmaWVkIGZvciBgZGViaXRgIHRyYW5zZmVycy4gIGBzd2VlcGAgLSBTd2VlcCBmdW5kcyBmcm9tIHlvdXIgZnVuZGluZyBhY2NvdW50IGBwcmVmdW5kZWRfcnRwX2NyZWRpdHNgIC0gVXNlIHlvdXIgcHJlZnVuZGVkIFJUUCBjcmVkaXQgYmFsYW5jZSB3aXRoIFBsYWlkIGBwcmVmdW5kZWRfYWNoX2NyZWRpdHNgIC0gVXNlIHlvdXIgcHJlZnVuZGVkIEFDSCBjcmVkaXQgYmFsYW5jZSB3aXRoIFBsYWlkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlIHtcbiAgICBTd2VlcCA9ICdzd2VlcCcsXG4gICAgUHJlZnVuZGVkUnRwQ3JlZGl0cyA9ICdwcmVmdW5kZWRfcnRwX2NyZWRpdHMnLFxuICAgIFByZWZ1bmRlZEFjaENyZWRpdHMgPSAncHJlZnVuZGVkX2FjaF9jcmVkaXRzJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB1c2FnZSBvZiBjcmVkaXRzLiBGb3IgYWxsIGRvbGxhciBhbW91bnRzLCB1c2UgYSBkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiB0aGUgb3JpZ2luYXRvciBpcyBleHBlY3RlZCB0byBwcm9jZXNzIGNyZWRpdCB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9mcmVxdWVuY3k6IE9yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBoaWdoZXN0IGFtb3VudCBmb3IgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGNyZWRpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2F2ZXJhZ2VfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIG1vbnRobHkgZXhwZWN0ZWQgQUNIIGNyZWRpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgdXNlIGNhc2VzIGZvciB0aGUgb3JpZ2luYXRvcuKAmXMgY3JlZGl0IHRyYW5zZmVycy4gVGhpcyBzaG91bGQgYmUgYSBsaXN0IHRoYXQgY29udGFpbnMgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjb2RlczogIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGUuZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHNlY19jb2RlczogQXJyYXk8Q3JlZGl0QUNIQ2xhc3M+O1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGRlYml0cy4gRm9yIGFsbCBkb2xsYXIgYW1vdW50cywgdXNlIGEgZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgdGhlIG9yaWdpbmF0b3IgaXMgZXhwZWN0ZWQgdG8gcHJvY2VzcyBkZWJpdCB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9mcmVxdWVuY3k6IE9yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBoaWdoZXN0IGFtb3VudCBmb3IgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2hpZ2hlc3RfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGF2ZXJhZ2UgYW1vdW50IHBlciBkZWJpdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgbW9udGhseSBleHBlY3RlZCBBQ0ggZGViaXQgcHJvY2Vzc2luZyBhbW91bnQgZm9yIHRoZSBuZXh0IDYtMTIgbW9udGhzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgdXNlIGNhc2VzIGZvciB0aGUgb3JpZ2luYXRvcuKAmXMgZGViaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gdGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lciwgZWcuIGJpbGwgcGF5bWVudCAgYFxcXCJ0ZWxcXFwiYCAtIFRlbGVwaG9uZS1Jbml0aWF0ZWQgRW50cnkgIGBcXFwid2ViXFxcImAgLSBJbnRlcm5ldC1Jbml0aWF0ZWQgRW50cnkgLSBkZWJpdHMgZnJvbSBhIGNvbnN1bWVy4oCZcyBhY2NvdW50IHdoZXJlIHRoZWlyIGF1dGhvcml6YXRpb24gaXMgb2J0YWluZWQgb3ZlciB0aGUgSW50ZXJuZXRcbiAgICAgKiBAdHlwZSB7QXJyYXk8QUNIQ2xhc3M+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VjX2NvZGVzOiBBcnJheTxBQ0hDbGFzcz47XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgYmVpbmcgdXNlZCB0byBpbml0aWF0ZSB0aGUgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIENsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvciB3aG9zZSBkb2N1bWVudCB0aGF0IHlvdSB3YW50IHRvIHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmaWxlIHRvIHVwbG9hZC4gVGhlIGZpbGUgc2l6ZSBtdXN0IGJlIGxlc3MgdGhhbiAyME1CLiBTdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zOiAucGRmLlxuICAgICAqIEB0eXBlIHthbnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgZmlsZTogYW55O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckRvY3VtZW50UHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdXJwb3NlOiBUcmFuc2ZlckRvY3VtZW50UHVycG9zZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogT3JpZ2luYXRvcuKAmXMgZGlsaWdlbmNlIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzIHtcbiAgICBOb3RTdWJtaXR0ZWQgPSAnbm90X3N1Ym1pdHRlZCcsXG4gICAgU3VibWl0dGVkID0gJ3N1Ym1pdHRlZCcsXG4gICAgVW5kZXJSZXZpZXcgPSAndW5kZXJfcmV2aWV3JyxcbiAgICBBcHByb3ZlZCA9ICdhcHByb3ZlZCcsXG4gICAgRGVuaWVkID0gJ2RlbmllZCcsXG4gICAgTW9yZUluZm9ybWF0aW9uUmVxdWlyZWQgPSAnbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSB0aGUgb3JpZ2luYXRvciB3aG9zZSBkaWxpZ2VuY2UgdGhhdCB5b3Ugd2FudCB0byBzdWJtaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2RpbGlnZW5jZTogVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIHVwbG9hZGVkIGZpbGUuICBgXFxcIkRVRV9ESUxJR0VOQ0VcXFwiYCAtIFRoZSB0cmFuc2ZlciBkdWUgZGlsaWdlbmNlIGRvY3VtZW50IG9mIHRoZSBvcmlnaW5hdG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEb2N1bWVudFB1cnBvc2Uge1xuICAgIER1ZURpbGlnZW5jZSA9ICdEVUVfRElMSUdFTkNFJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gZXZlbnQgaW4gdGhlIFRyYW5zZmVycyBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBldmVudCBvY2N1cnJlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGU6IFRyYW5zZmVyRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgb21pdHRlZCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGFzc29jaWF0ZWQgZnVuZGluZyBhY2NvdW50LCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgcHJlc2VudCwgdGhpcyBpbmRpY2F0ZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLiBUaGlzIGZpZWxkIGlzIGBudWxsYCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB0aGlzIGJhbGFuY2UgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPbWl0dGFibGVUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl90eXBlPzogT21pdHRhYmxlVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFRoaXMgZmllbGQgaXMgb21pdHRlZCBmb3IgUGxhaWQgTGVkZ2VyIFN3ZWVwIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdHJhbnNmZXJfYW1vdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2lnbmVkIGFtb3VudCBvZiBob3cgbXVjaCB3YXMgYHN3ZXB0YCBvciBgcmV0dXJuX3N3ZXB0YCBmb3IgdGhpcyB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCItNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBzd2VlcF9hbW91bnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC4gQSBub24tbnVsbCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGV2ZW50IGlzIGZvciB0aGUgYXNzb2NpYXRlZCByZWZ1bmQgb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoZSB0cmFuc2ZlciB0aGF0IHRoaXMgZXZlbnQgYXBwbGllcyB0by4gT25seSBwcmVzZW50IGlmIHRoZSB0cmFuc2ZlciB3YXMgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciBhbGwgdHJhbnNhY3Rpb25zIHRvL2Zyb20gYW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGV2ZW50X3R5cGVzPzogQXJyYXk8VHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi4gSWYgdGhlIG51bWJlciBvZiBldmVudHMgbWF0Y2hpbmcgdGhlIGFib3ZlIHBhcmFtZXRlcnMgaXMgZ3JlYXRlciB0aGFuIGBjb3VudGAsIHRoZSBtb3N0IHJlY2VudCBldmVudHMgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZnNldCBpbnRvIHRoZSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cy4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0wLCB0aGUgZmlyc3QgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MjUsIHRoZSBuZXh0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0aW9uIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgdHJhbnNmZXJzIGZyb20gYSBzcGVjaWZpYyBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVyIGV2ZW50cyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVyIGV2ZW50cyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2V2ZW50czogQXJyYXk8VHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBldmVudHMgdG8gYmUgcHVsbGVkIGZyb20gdGhlIGVuZHBvaW50IHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldHVybmVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHlvdXIgb3JpZ2luYXRpb24gYWNjb3VudDsgYSBgY3JlZGl0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBvdXQgb2YgeW91ciBvcmlnaW5hdGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJFdmVudExpc3RUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgKGxhcmdlc3QpIGBldmVudF9pZGAgZmV0Y2hlZCB2aWEgdGhlIHN5bmMgZW5kcG9pbnQsIG9yIDAgaW5pdGlhbGx5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFmdGVyX2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlckV2ZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2V2ZW50czogQXJyYXk8VHJhbnNmZXJFdmVudD47XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGVyZSBhcmUgbW9yZSBldmVudHMgdG8gYmUgcHVsbGVkIGZyb20gdGhlIGVuZHBvaW50IHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHJldHVybmVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgZXZlbnQgdGhhdCB0aGlzIHRyYW5zZmVyIHJlcHJlc2VudHMuIEV2ZW50IHR5cGVzIHdpdGggcHJlZml4IGBzd2VlcGAgcmVwcmVzZW50cyBldmVudHMgZm9yIFBsYWlkIExlZGdlciBzd2VlcHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGBzZXR0bGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gIGBmdW5kc19hdmFpbGFibGVgOiBGdW5kcyBmcm9tIHRoZSB0cmFuc2ZlciBoYXZlIGJlZW4gcmVsZWFzZWQgZnJvbSBob2xkIGFuZCBhcHBsaWVkIHRvIHRoZSBsZWRnZXJcXCdzIGF2YWlsYWJsZSBiYWxhbmNlLiAoT25seSBhcHBsaWNhYmxlIHRvIEFDSCBkZWJpdHMuKSAgYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLiAgYHN3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyBzd2VwdCB0byAvIGZyb20gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlcHRfc2V0dGxlZGA6IENyZWRpdHMgYXJlIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gb3IgZGViaXRzIGhhdmUgYmVlbiBkZWR1Y3RlZCBmcm9tIHRoZSBjdXN0b21lcuKAmXMgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudC4gIGByZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHRyYW5zZmVyIGJlaW5nIHJldHVybmVkLCBmdW5kcyB3ZXJlIHB1bGxlZCBmcm9tIG9yIHB1c2hlZCBiYWNrIHRvIHRoZSBzd2VlcCBhY2NvdW50LiAgYHN3ZWVwLnBlbmRpbmdgOiBBIG5ldyBsZWRnZXIgc3dlZXAgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHN3ZWVwLnBvc3RlZGA6IFRoZSBsZWRnZXIgc3dlZXAgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHN3ZWVwLnNldHRsZWRgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIGZ1bmRpbmcgYWNjb3VudC4gVGhpcyBtZWFucyB0aGF0IGZ1bmRzIHdpdGhkcmF3biBmcm9tIFBsYWlkIExlZGdlciBiYWxhbmNlIGhhdmUgcmVhY2hlZCB0aGUgZnVuZGluZyBhY2NvdW50LCBvciBmdW5kcyB0byBiZSBkZXBvc2l0ZWQgaW50byB0aGUgUGxhaWQgTGVkZ2VyIEJhbGFuY2UgaGF2ZSBiZWVuIHB1bGxlZCwgYW5kIHRoZSBob2xkIHBlcmlvZCBoYXMgYmVndW4uICBgc3dlZXAucmV0dXJuZWRgOiBBIHBvc3RlZCBsZWRnZXIgc3dlZXAgd2FzIHJldHVybmVkLiAgYHN3ZWVwLmZhaWxlZGA6IFRoZSBsZWRnZXIgc3dlZXAgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHN3ZWVwLmZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIGxlZGdlciBzd2VlcCBoYXZlIGJlZW4gcmVsZWFzZWQgZnJvbSBob2xkIGFuZCBhcHBsaWVkIHRvIHRoZSBsZWRnZXJcXCdzIGF2YWlsYWJsZSBiYWxhbmNlLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0byBkZWJpdHMuICBgcmVmdW5kLnBlbmRpbmdgOiBBIG5ldyByZWZ1bmQgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYHJlZnVuZC5jYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQuICBgcmVmdW5kLmZhaWxlZGA6IFRoZSByZWZ1bmQgZmFpbGVkLCBubyBmdW5kcyB3ZXJlIG1vdmVkLiAgYHJlZnVuZC5wb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZWZ1bmQuc2V0dGxlZGA6IFRoZSByZWZ1bmQgdHJhbnNhY3Rpb24gaGFzIHNldHRsZWQgaW4gdGhlIFBsYWlkIGxpbmtlZCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5lZGA6IEEgcG9zdGVkIHJlZnVuZCB3YXMgcmV0dXJuZWQuICBgcmVmdW5kLnN3ZXB0YDogVGhlIHJlZnVuZCB3YXMgc3dlcHQgZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGByZWZ1bmQucmV0dXJuX3N3ZXB0YDogRHVlIHRvIHRoZSByZWZ1bmQgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIEZ1bmRzQXZhaWxhYmxlID0gJ2Z1bmRzX2F2YWlsYWJsZScsXG4gICAgUmV0dXJuZWQgPSAncmV0dXJuZWQnLFxuICAgIFN3ZXB0ID0gJ3N3ZXB0JyxcbiAgICBTd2VwdFNldHRsZWQgPSAnc3dlcHRfc2V0dGxlZCcsXG4gICAgUmV0dXJuU3dlcHQgPSAncmV0dXJuX3N3ZXB0JyxcbiAgICBTd2VlcFBlbmRpbmcgPSAnc3dlZXAucGVuZGluZycsXG4gICAgU3dlZXBQb3N0ZWQgPSAnc3dlZXAucG9zdGVkJyxcbiAgICBTd2VlcFNldHRsZWQgPSAnc3dlZXAuc2V0dGxlZCcsXG4gICAgU3dlZXBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgU3dlZXBGYWlsZWQgPSAnc3dlZXAuZmFpbGVkJyxcbiAgICBTd2VlcEZ1bmRzQXZhaWxhYmxlID0gJ3N3ZWVwLmZ1bmRzX2F2YWlsYWJsZScsXG4gICAgUmVmdW5kUGVuZGluZyA9ICdyZWZ1bmQucGVuZGluZycsXG4gICAgUmVmdW5kQ2FuY2VsbGVkID0gJ3JlZnVuZC5jYW5jZWxsZWQnLFxuICAgIFJlZnVuZEZhaWxlZCA9ICdyZWZ1bmQuZmFpbGVkJyxcbiAgICBSZWZ1bmRQb3N0ZWQgPSAncmVmdW5kLnBvc3RlZCcsXG4gICAgUmVmdW5kU2V0dGxlZCA9ICdyZWZ1bmQuc2V0dGxlZCcsXG4gICAgUmVmdW5kUmV0dXJuZWQgPSAncmVmdW5kLnJldHVybmVkJyxcbiAgICBSZWZ1bmRTd2VwdCA9ICdyZWZ1bmQuc3dlcHQnLFxuICAgIFJlZnVuZFJldHVyblN3ZXB0ID0gJ3JlZnVuZC5yZXR1cm5fc3dlcHQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgLiBJZiBtdWx0aXBsZSB0cmFuc2ZlciBldmVudHMgb2NjdXIgd2l0aGluIGEgc2luZ2xlIG1pbnV0ZSwgb25seSBvbmUgd2ViaG9vayB3aWxsIGJlIGZpcmVkLCBzbyBhIHNpbmdsZSB3ZWJob29rIGluc3RhbmNlIG1heSBjb3JyZXNwb25kIHRvIG11bHRpcGxlIHRyYW5zZmVyIGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVmaW5lcyBhbiBleHBlY3RlZCBzd2VlcCBkYXRlIGFuZCBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlbWVudCBkYXRlIG9mIGEgc3dlZXAgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICAgICAqL1xuICAgIHN3ZWVwX3NldHRsZW1lbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2N1bXVsYXRlZCBhbW91bnQgdGhhdCBoYXMgYmVlbiBzd2VwdCBieSBgc3dlZXBfc2V0dGxlbWVudF9kYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgc3dlcHRfc2V0dGxlZF9hbW91bnQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBldmVudCB0eXBlIGZvciBhIHRyYW5zZmVyIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXR1cm5lZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmFpbHVyZSBjb2RlLCBlLmcuIGBSMDFgLiAgQSBmYWlsdXJlIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXR1cm5lZGAuIFNlZSBbQUNIIHJldHVybiBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzIGFuZCBbUlRQIGVycm9yIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jcnRwLWVycm9yLWNvZGVzKSBmb3IgUlRQIGVycm9yIGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGZhaWx1cmVfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByZXR1cm4gY29kZSwgZS5nLiBgUjAxYC4gIEEgcmV0dXJuIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNmZXIgc3RhdHVzIGlzIGByZXR1cm5lZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb3JpZ2luYXRvclxcJ3MgZnVuZGluZyBhY2NvdW50LCBsaW5rZWQgd2l0aCBQbGFpZCBMaW5rIG9yIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRnVuZGluZ0FjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgdGhpcmQtcGFydHkgc2VuZGVyIChUUFMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiAgQSBkZWNpc2lvbiByZWdhcmRpbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgYEFQUFJPVkVEYCDigJMgVGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyByZWNlaXZlZCB0aGUgZW5kIHVzZXJcXCdzIGNvbnNlbnQgYW5kIGhhcyBiZWVuIGFwcHJvdmVkIGZvciBwcm9jZXNzaW5nIGJ5IFBsYWlkLiBUaGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgZmllbGQgaXMgc2V0IGlmIFBsYWlkIHdhcyB1bmFibGUgdG8gZmV0Y2ggdGhlIGFjY291bnQgaW5mb3JtYXRpb24uIFlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IGZ1cnRoZXIgcmV2aWV3IGlzIHJlY29tbWVuZGVkIChpLmUuLCB1c2UgTGluayBpbiB1cGRhdGUgbW9kZSB0byByZS1hdXRoZW50aWNhdGUgeW91ciB1c2VyIHdoZW4gYGRlY2lzaW9uX3JhdGlvbmFsZS5jb2RlYCBpcyBgSVRFTV9MT0dJTl9SRVFVSVJFRGApLiBSZWZlciB0byB0aGUgYGNvZGVgIGZpZWxkIGluIHRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBvYmplY3QgZm9yIGRldGFpbHMuICBgREVDTElORURgIOKAkyBQbGFpZCByZXZpZXdlZCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgYW5kIGRlY2xpbmVkIHByb2Nlc3NpbmcuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50QXV0aG9yaXphdGlvbkRlY2lzaW9uIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGUge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC4gUmV0dXJuZWQgb25seSBpZiBgYWNjb3VudF9pZGAgd2FzIHNldCBvbiBpbnRlbnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxvdyBvZiB0cmFuc2ZlciBmdW5kcy4gIGBQQVlNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20gYW4gZW5kIHVzZXJcXCdzIGFjY291bnQgdG8geW91ciBidXNpbmVzcyBhY2NvdW50LiAgYERJU0JVUlNFTUVOVGA6IFRyYW5zZmVycyBmdW5kcyBmcm9tIHlvdXIgYnVzaW5lc3MgYWNjb3VudCB0byBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50Q3JlYXRlTW9kZSB7XG4gICAgUGF5bWVudCA9ICdQQVlNRU5UJyxcbiAgICBEaXNidXJzZW1lbnQgPSAnRElTQlVSU0VNRU5UJ1xufVxuXG4vKipcbiAqIFRoZSBuZXR3b3JrIG9yIHJhaWxzIHVzZWQgZm9yIHRoZSB0cmFuc2Zlci4gRGVmYXVsdHMgdG8gYHNhbWUtZGF5LWFjaGAuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCB1c2luZyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXMuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCB1c2luZyBgcnRwYCwgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYWNjb3VudCBiZWluZyBjcmVkaXRlZCBkb2VzIG5vdCBzdXBwb3J0IFJUUCwgdGhlIHRyYW5zZmVyIHdpbGwgYmUgc2VudCBvdmVyIEFDSCBhcyBsb25nIGFzIGFuIGBhY2hfY2xhc3NgIGlzIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0LiBJZiBSVFAgaXNuXFwndCBzdXBwb3J0ZWQgYnkgdGhlIGFjY291bnQgYW5kIG5vIGBhY2hfY2xhc3NgIGlzIHByb3ZpZGVkLCB0aGUgdHJhbnNmZXIgd2lsbCBmYWlsIHRvIGJlIHN1Ym1pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBhY2NvdW50IHVzZWQgdG8gZnVuZCB0aGUgdHJhbnNmZXIuIFNob3VsZCBiZSBzcGVjaWZpZWQgaWYgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcyBvbmx5LiBJZiB1c2luZyBQbGFpZCBMZWRnZXIsIGxlYXZlIHRoaXMgZmllbGQgYmxhbmsuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIGFuZCB5b3UgYXJlIHVzaW5nIGxlZ2FjeSBmdW5kaW5nIG1ldGhvZHMsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy4gT3RoZXJ3aXNlLCBQbGFpZCBMZWRnZXIgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiAxNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGUgaW50ZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXF1ZXN0O1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbWV0YWRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlcXVpcmVfZ3VhcmFudGVlPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfaW50ZW50OiBUcmFuc2ZlckludGVudENyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVwcmVzZW50cyBhIHRyYW5zZmVyIGludGVudCB3aXRoaW4gVHJhbnNmZXIgVUkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlckludGVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBjcmVhdGVkIHRocm91Z2ggdGhlIFVJLiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU1vZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbW9kZTogVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudENyZWF0ZU5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckluUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA4IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIHRyYW5zZmVyIHJlcXVpcmVzIGEgYEdVQVJBTlRFRURgIGRlY2lzaW9uIGJ5IFBsYWlkIHRvIHByb2NlZWQgKEd1YXJhbnRlZSBjdXN0b21lcnMgb25seSkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHJlYXNvbiBmb3IgYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50LiBSZXR1cm5lZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBpbnRlbnQgc3RhdHVzIGlzIGBmYWlsZWRgLiBOdWxsIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uIHtcbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBmb3IgYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50IChpLmUuLCBhbiBBUEkgZXJyb3Igb3IgdGhlIGF1dGhvcml6YXRpb24gYmVpbmcgZGVjbGluZWQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggYSBmYWlsZWQgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50R2V0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2ZlciBpbnRlbnQuICBgUEVORElOR2A6IFRoZSB0cmFuc2ZlciBpbnRlbnQgaXMgcGVuZGluZy4gYFNVQ0NFRURFRGA6IFRoZSB0cmFuc2ZlciBpbnRlbnQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiBgRkFJTEVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgdW5hYmxlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckludGVudFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBTdWNjZWVkZWQgPSAnU1VDQ0VFREVEJyxcbiAgICBGYWlsZWQgPSAnRkFJTEVEJ1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgYXJlIGluIHByb2Nlc3NpbmcgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBwZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgY3VzdG9tZXIgdGhhdCBvd25zIHRoZSBMZWRnZXIgYmFsYW5jZS4gVGhpcyBpcyBzbyBQbGFpZCBrbm93cyB3aGljaCBvZiB5b3VyIGN1c3RvbWVycyB0byBwYXlvdXQgb3IgY29sbGVjdCBmdW5kcy4gT25seSBhcHBsaWNhYmxlIGZvciBbUGxhdGZvcm0gY3VzdG9tZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLiBEbyBub3QgaW5jbHVkZSBpZiB5b3XigJlyZSBwYXlpbmcgb3V0IHRvIHlvdXJzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBmdW5kaW5nIGFjY291bnQgdG8gdXNlLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB0aGUgUGxhaWQgRGFzaGJvYXJkLCB1bmRlciB0aGUgXFxcIkFjY291bnQgSURcXFwiIGNvbHVtbi4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIExlZGdlciB3aWxsIGJlIHVzZWQuIElmIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAgaXMgc3BlY2lmaWVkLCB0aGUgYGZ1bmRpbmdfYWNjb3VudF9pZGAgbXVzdCBiZWxvbmcgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggbGVkZ2VyIGJhbGFuY2UgdG8gZGVwb3NpdCB0by4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgbGVkZ2VyX2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwb3NpdGl2ZSBhbW91bnQgb2YgaG93IG11Y2ggd2lsbCBiZSBkZXBvc2l0ZWQgaW50byBsZWRnZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlcG9zaXQgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgKHVwIHRvIDEwIGNoYXJhY3RlcnMpLiBOb3RlIHRoYXQgYmFua3MgdXRpbGl6ZSB0aGlzIGZpZWxkIGRpZmZlcmVudGx5LCBhbmQgbWF5IG9yIG1heSBub3Qgc2hvdyBpdCBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgZGVwb3NpdC4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciBkZXBvc2l0IGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGRlcG9zaXQgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQUNITmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyQUNITmV0d29yaztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTd2VlcH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBMZWRnZXIgdG8gcHVsbCBtb25leSBmcm9tLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcm9tX2xlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBMZWRnZXIgdG8gY3JlZGl0IG1vbmV5IHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0b19sZWRnZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIG1vdmUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gQW1vdW50IG11c3QgYmUgcG9zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciBkaXN0cmlidXRlLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgdGhlIHJlcXVlc3Qgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbGVkZ2VyIGRpc3RyaWJ1dGUgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgZGlzdHJpYnV0ZSBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIGxlZGdlciBkaXN0cmlidXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBnZXQuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGxlZGdlcl9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHlvdXIgUGxhaWQgRGFzaGJvYXJkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoaXMgd2lsbCBkZWZhdWx0IHRvIGlkIG9mIHRoZSBkZWZhdWx0IGxlZGdlciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgTGVkZ2VyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJMZWRnZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJMZWRnZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBMZWRnZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhpcyBMZWRnZXIgaXMgdGhlIGNsaWVudFxcJ3MgZGVmYXVsdCBsZWRnZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19kZWZhdWx0OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYHNldHRsZWRgLCBgZmFpbGVkYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgbGVkZ2VyIHN3ZWVwIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLnBvc3RlZGAgIGBzd2VlcC5wZW5kaW5nYCAtLT4gYHN3ZWVwLmZhaWxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAuc2V0dGxlZGAgIGBzd2VlcC5wb3N0ZWRgIC0tPiBgc3dlZXAucmV0dXJuZWRgICBgc3dlZXAuc2V0dGxlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGUge1xuICAgIFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc3dlZXAuc2V0dGxlZCcsXG4gICAgUmV0dXJuZWQgPSAnc3dlZXAucmV0dXJuZWQnLFxuICAgIEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnXG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGN1c3RvbWVyIHRoYXQgb3ducyB0aGUgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgaXMgc28gUGxhaWQga25vd3Mgd2hpY2ggb2YgeW91ciBjdXN0b21lcnMgdG8gcGF5b3V0IG9yIGNvbGxlY3QgZnVuZHMuIE9ubHkgYXBwbGljYWJsZSBmb3IgW1BsYXRmb3JtIGN1c3RvbWVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS4gRG8gbm90IGluY2x1ZGUgaWYgeW914oCZcmUgcGF5aW5nIG91dCB0byB5b3Vyc2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHRoZSBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggbGVkZ2VyIGJhbGFuY2UgdG8gd2l0aGRyYXcgZnJvbS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgbGVkZ2VyX2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgcG9zaXRpdmUgYW1vdW50IG9mIGhvdyBtdWNoIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlciBiYWxhbmNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjUuNTBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBsZWRnZXIgd2l0aGRyYXcuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgd2l0aGRyYXcgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zZmVycyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIG9yaWdpbmF0ZWQgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyczogQXJyYXk8VHJhbnNmZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgYXV0aG9yaXphdGlvbiB1c2FnZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGFpbHkgY3JlZGl0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgZGFpbHlfY3JlZGl0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYWlseSBkZWJpdCB1dGlsaXphdGlvbiBmb3JtYXR0ZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZVxuICAgICAqL1xuICAgIGRhaWx5X2RlYml0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb250aGx5IGNyZWRpdCB1dGlsaXphdGlvbiBmb3JtYXR0ZWQgYXMgYSBkZWNpbWFsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZVxuICAgICAqL1xuICAgIG1vbnRobHlfY3JlZGl0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb250aGx5IGRlYml0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgbW9udGhseV9kZWJpdF91dGlsaXphdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGFpbHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9jcmVkaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IGFuZCBkZWJpdCB0cmFuc2ZlcnMgaW4gY3VycmVudCBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBtb250aGx5X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2RlYml0X3RyYW5zZmVyX3ZvbHVtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2ZlcnMgaW4gY3VycmVudCBjYWxlbmRhciBtb250aCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbW9udGhseV9jcmVkaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBkb2xsYXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmV0dXJuX3JhdGVzPzogVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl91c2FnZT86IFRyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZSB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHJldHVybiByYXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc1xuICAgICAqL1xuICAgIGxhc3RfNjBkPzogVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWwgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyByZXR1cm4gcmF0ZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBvdmVyYWxsIHJldHVybiByYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gICAgICovXG4gICAgb3ZlcmFsbF9yZXR1cm5fcmF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5hdXRob3JpemVkIHJldHVybiByYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl9yYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhZG1pbmlzdHJhdGl2ZSByZXR1cm4gcmF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbFxuICAgICAqL1xuICAgIGFkbWluaXN0cmF0aXZlX3JldHVybl9yYXRlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gVGhpcyBpcyB0aGUgQUJBIG51bWJlcjsgZm9yIHNvbWUgaW5zdGl0dXRpb25zLCB0aGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgQUNIIG51bWJlciB1c2VkIGluIGByb3V0aW5nX251bWJlcmAuIFRoaXMgZmllbGQgbXVzdCBiZSBzZXQgZm9yIHRoZSBjcmVhdGVkIGl0ZW0gdG8gYmUgZWxpZ2libGUgZm9yIHdpcmUgdHJhbnNmZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYGFjaGAsIHRoZSBuZXh0LWRheSBjdXRvZmYgaXMgODozMCBQTSBFYXN0ZXJuIFRpbWUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgc2FtZS1kYXktYWNoYCwgdGhlIHNhbWUtZGF5IGN1dG9mZiBpcyAzOjMwIFBNIEVhc3Rlcm4gVGltZS4gSWYgdGhlIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhZnRlciB0aGlzIGN1dG9mZiBidXQgYmVmb3JlIHRoZSBuZXh0LWRheSBjdXRvZmYsIGl0IHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzOyB0aGlzIHdpbGwgYXBwbHkgdG8gYm90aCBsZWdzIG9mIHRoZSB0cmFuc2ZlciBpZiBhcHBsaWNhYmxlLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgYXMgYHJ0cGAsICBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgcm91dGUgYmV0d2VlbiBSZWFsIFRpbWUgUGF5bWVudCByYWlsIGJ5IFRDSCBvciBGZWROb3cgcmFpbHMgYXMgbmVjZXNzYXJ5LiBJZiBhIHRyYW5zZmVyIGlzIHN1Ym1pdHRlZCBhcyBgcnRwYCBhbmQgdGhlIGNvdW50ZXJwYXJ0eSBhY2NvdW50IGlzIG5vdCBlbGlnaWJsZSBmb3IgUlRQLCB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgcmVxdWVzdCB3aWxsIGZhaWwgd2l0aCBhbiBgSU5WQUxJRF9GSUVMRGAgZXJyb3IgY29kZS4gVG8gcHJlLWNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIGEgY291bnRlcnBhcnR5IGFjY291bnQgY2FuIHN1cHBvcnQgUlRQLCBjYWxsIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgYmVmb3JlIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAuICBXaXJlIHRyYW5zZmVycyBhcmUgY3VycmVudGx5IGluIGVhcmx5IGF2YWlsYWJpbGl0eS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gYHdpcmVgIGFzIGEgcGF5bWVudCBuZXR3b3JrLCBjb250YWN0IHlvdXIgQWNjb3VudCBNYW5hZ2VyLiBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgd2lyZWAsIHRoZSBgdHlwZWAgbXVzdCBiZSBgY3JlZGl0YDsgd2lyZSBkZWJpdHMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRoZSBjdXRvZmYgdG8gc3VibWl0IGEgd2lyZSBwYXltZW50IGlzIDQ6MzAgUE0gRWFzdGVybiBUaW1lIG9uIGEgYnVzaW5lc3MgZGF5OyB3aXJlcyBzdWJtaXR0ZWQgYWZ0ZXIgdGhhdCB0aW1lIHdpbGwgYmUgcHJvY2Vzc2VkIG9uIHRoZSBuZXh0IGJ1c2luZXNzIGRheS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnLFxuICAgIFdpcmUgPSAnd2lyZSdcbn1cblxuLyoqXG4gKiBUaGUgb3JpZ2luYXRvclxcJ3MgYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHdvLWxldHRlciBjb2RlIGZvciB0aGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgKGUuZy4sIFxcXCI5NDEwM1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnlfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIgYmVpbmcgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBwdWJsaWMtZmFjaW5nIHN1cmZhY2VzLCBlLmcuIFBsYWlkIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yLiBUaGlzIGlkZW50aWZpZXIgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIGFuZCBzaG91bGQgYmUgc3RvcmVkIGFzc29jaWF0ZWQgd2l0aCBlbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBhbnkgbmFtZSBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGFueV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYXRvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYnVzaW5lc3MgbmFtZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBkYmE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IElEIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHRheF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgY3JlZGl0X3VzYWdlX2NvbmZpZ3VyYXRpb24/OiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRlYml0X3VzYWdlX2NvbmZpZ3VyYXRpb24/OiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgYWRkcmVzczogVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE5BSUNTIGNvZGUgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgbmFpY3NfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZ1bmRpbmdBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnQ6IFRyYW5zZmVyRnVuZGluZ0FjY291bnQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJGdW5kaW5nQWNjb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50OiBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgZW5kIGN1c3RvbWVyIChpLmUuIHRoZSBvcmlnaW5hdG9yKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGV0YWlsZWRPcmlnaW5hdG9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3I6IERldGFpbGVkT3JpZ2luYXRvcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG9yaWdpbmF0b3JzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG9yaWdpbmF0b3JzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3JpZ2luYXRvcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JzOiBBcnJheTxPcmlnaW5hdG9yPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gb25ib2FyZGluZyBvcmlnaW5hdG9yIGhhcyBiZWVuIHVwZGF0ZWQuIENhbGwgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgdG8gY2hlY2sgdGhlIGxhdGVzdCBzdGF0dXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIlRSQU5TRkVSXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgXFxcIlBMQVRGT1JNX09OQk9BUkRJTkdfVVBEQVRFXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9uYm9hcmRpbmdVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0b3NfYWNjZXB0YW5jZV9tZXRhZGF0YTogVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBJU084NjAxIHRpbWVzdGFtcCBpbmRpY2F0aW5nIHRoZSBtb3N0IHJlY2VudCB0aW1lIHRoZSBwbGF0Zm9ybSBjb2xsZWN0ZWQgb25ib2FyZGluZyBkYXRhIGZyb20gdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX3Jldmlld2VkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgVVJMIHRvIHdoaWNoIGEgYFBMQVRGT1JNX09OQk9BUkRJTkdfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9vcmlnaW5hdG9yL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3Mgb2YgYSBwZXJzb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuYW1lPzogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWU7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkX251bWJlcj86IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiBiaXJ0aCBvZiB0aGUgcGVyc29uLiBGb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgcGVyc29uIGFuZCB0aGUgb3JpZ2luYXRvciB0aGV5IGFyZSByZWxhdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVsYXRpb25zaGlwX3RvX29yaWdpbmF0b3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSUQgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHN1Ym1pdHRpbmcgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGVyc29uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBlcnNvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJRCBudW1iZXIgb2YgdGhlIHBlcnNvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIHRoZSBwZXJzb25cXCdzIElEIE51bWJlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBUaGUgcGVyc29uXFwncyBsZWdhbCBuYW1lXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcGllY2Ugb2YgaW5mb3JtYXRpb24gdGhhdCBpcyBvdXRzdGFuZGluZyBmb3IgdGhlIHNjYWxlZCBwbGF0Zm9ybSBvbmJvYXJkaW5nIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVVUlEIG9mIHRoZSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1aXJlbWVudC4gT25seSBwcmVzZW50IGZvciBpbmRpdmlkdWFsLXNjb3BlZCByZXF1aXJlbWVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gICAgICovXG4gICAgcGVyc29uX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBzaW5nbGUgcmVxdWlyZW1lbnQgc3VibWlzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmVxdWlyZW1lbnQgYmVpbmcgc3VibWl0dGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvblxuICAgICAqL1xuICAgIHJlcXVpcmVtZW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHJlcXVpcmVtZW50LCB3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gb2JqZWN0IGRlcGVuZGluZyBvbiB0aGUgYHJlcXVpcmVtZW50X3R5cGVgLiBJZiBpdCBpcyBhbiBvYmplY3QsIHRoZSBvYmplY3Qgc2hvdWxkIGJlIEpTT04gbWFyc2hhbGVkIGludG8gYSBzdHJpbmcuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGlzIGVuZHBvaW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBleGFtcGxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBlcnNvbl9pZGAgb2YgdGhlIHBlcnNvbiB0aGUgcmVxdWlyZW1lbnQgc3VibWlzc2lvbiBpcyByZWxhdGVkIHRvLiBBIGBwZXJzb25faWRgIGlzIHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAuIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBmb3IgcmVxdWlyZW1lbnRzIHRoYXQgYXJlIG5vdCByZWxhdGVkIHRvIGEgcGVyc29uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAgICAgKi9cbiAgICBwZXJzb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHJlcXVpcmVtZW50IHN1Ym1pc3Npb25zIHRoYXQgYWxsIHJlbGF0ZSB0byB0aGUgb3JpZ2luYXRvci4gTXVzdCBjb250YWluIGJldHdlZW4gMSBhbmQgNTAgcmVxdWlyZW1lbnQgc3VibWlzc2lvbnMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfc3VibWlzc2lvbnM6IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb24+O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIGFjY2VwdGFuY2Ugb2YgVGVybXMgb2YgU2VydmljZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIFRPUyBhZ3JlZW1lbnQgd2FzIGFjY2VwdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhZ3JlZW1lbnRfYWNjZXB0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIG9yaWdpbmF0b3Igd2hlbiB0aGV5IGFjY2VwdGVkIHRoZSBUT1MuIEZvcm1hdHRlZCBhcyBhbiBJUHY0IG9yIElQdjYgSVAgYWRkcmVzc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2lwX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJU084NjAxIHRpbWVzdGFtcCBpbmRpY2F0aW5nIHdoZW4gdGhlIG9yaWdpbmF0b3IgYWNjZXB0ZWQgdGhlIFRPU1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBhZ3JlZW1lbnRfYWNjZXB0ZWRfYXQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRoZSBlbmQgY3VzdG9tZXIgd2lsbCBiZSByZWRpcmVjdGVkIHRvIGFmdGVyIGNvbXBsZXRpbmcgcXVlc3Rpb25zIGluIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVSTCB0aGF0IHlvdSB3aWxsIHJlZGlyZWN0IHRoZSBlbmQgY3VzdG9tZXIgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBvbmJvYXJkaW5nX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHJlY3VycmluZyB0cmFuc2Zlci4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHJlY3VycmluZyBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgZGVmYXVsdCBgZnVuZGluZ19hY2NvdW50X2lkYCBzcGVjaWZpZWQgZHVyaW5nIG9uYm9hcmRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2ZlclJlY3VycmluZ05ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBlbmQgdXNlciBpcyBpbml0aWF0aW5nIHRoZSBzcGVjaWZpYyB0cmFuc2ZlciB0aGVtc2VsdmVzIHZpYSBhbiBpbnRlcmFjdGl2ZSBVSSwgdGhpcyBzaG91bGQgYmUgYHRydWVgOyBmb3IgYXV0b21hdGljIHJlY3VycmluZyBwYXltZW50cyB3aGVyZSB0aGUgZW5kIHVzZXIgaXMgbm90IGFjdHVhbGx5IGluaXRpYXRpbmcgZWFjaCBpbmRpdmlkdWFsIHRyYW5zZmVyLCBpdCBzaG91bGQgYmUgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gVGhpcyBmaWVsZCBtYXkgb25seSBiZSB1c2VkIHdoZW4gdXNpbmcgYHNhbmRib3hgIGVudmlyb25tZW50LiBJZiBwcm92aWRlZCwgdGhlIGNyZWF0ZWQgYHJlY3VycmluZ190cmFuc2ZlcmAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuIE5ldyBvcmlnaW5hdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdoZW4gdGhlIGFzc29jaWF0ZWQgYHRlc3RfY2xvY2tgIGFkdmFuY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGV2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBUcmFuc2ZlckRldmljZTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcj86IFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyOiBSZWN1cnJpbmdUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYGZ1bmRpbmdfYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJzOiBBcnJheTxSZWN1cnJpbmdUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBOZXR3b3JrcyBlbGlnaWJsZSBmb3IgcmVjdXJyaW5nIHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFJ0cCA9ICdydHAnXG59XG5cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGJlIGV4ZWN1dGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF91bml0OiBUcmFuc2ZlclNjaGVkdWxlSW50ZXJ2YWxVbml0O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcmVjdXJyaW5nIGBpbnRlcnZhbF91bml0c2AgYmV0d2VlbiBvcmlnaW5hdGlvbnMuIFRoZSByZWN1cnJpbmcgaW50ZXJ2YWwgKGJlZm9yZSBob2xpZGF5IGFkanVzdG1lbnQpIGlzIGNhbGN1bGF0ZWQgYnkgbXVsdGlwbHlpbmcgYGludGVydmFsX3VuaXRgIGFuZCBgaW50ZXJ2YWxfY291bnRgLiBGb3IgZXhhbXBsZSwgdG8gc2NoZWR1bGUgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2hpY2ggb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IHR3byB3ZWVrcywgc2V0IGBpbnRlcnZhbF91bml0YCA9IGB3ZWVrYCBhbmQgYGludGVydmFsX2NvdW50YCA9IDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRheSBvZiB0aGUgaW50ZXJ2YWwgb24gd2hpY2ggdG8gc2NoZWR1bGUgdGhlIHRyYW5zZmVyLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgd2Vla2AsIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBzaG91bGQgYmUgYW4gaW50ZWdlciBmcm9tIDEgKE1vbmRheSkgdG8gNSAoRnJpZGF5KS4gIElmIHRoZSBgaW50ZXJ2YWxfdW5pdGAgaXMgYG1vbnRoYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbi4gSW50ZWdlcnMgZnJvbSAxIHRvIDI4IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgdHJhbnNmZXIgb24gdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdXNlIC0xOyB0byBtYWtlIHRoZSB0cmFuc2ZlciBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi4gIFRoZSB0cmFuc2ZlciB3aWxsIGJlIG9yaWdpbmF0ZWQgb24gdGhlIG5leHQgYXZhaWxhYmxlIGJhbmtpbmcgZGF5IGlmIHRoZSBkZXNpZ25hdGVkIGRheSBpcyBhIG5vbiBiYW5raW5nIGRheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBUaGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgRm9yIGBydHBgIHJlY3VycmluZyB0cmFuc2ZlcnMsIGBzdGFydF9kYXRlYCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuIE90aGVyd2lzZSwgaWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBlbmQgb24gdGhlIGxhc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGJlZm9yZSB0aGUgYGVuZF9kYXRlYC4gSWYgdGhlIGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiAgYGFjdGl2ZWA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaXMgY3VycmVudGx5IGFjdGl2ZS4gYGNhbmNlbGxlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50IG9yIFBsYWlkLiBgZXhwaXJlZGA6IFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgaGFzIGNvbXBsZXRlZCBhbGwgb3JpZ2luYXRpb25zIGFjY29yZGluZyB0byBpdHMgcmVjdXJyaW5nIHNjaGVkdWxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXMge1xuICAgIEFjdGl2ZSA9ICdhY3RpdmUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmVmdW5kIHdpdGhpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZCB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHJlZnVuZCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWZ1bmRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgcmVmdW5kIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFjZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgYmFzZWQgb24gaXRzIG5ldHdvcmsuIFRoaXMgd2lsbCBvbmx5IGJlIHNldCBhZnRlciB0aGUgdHJhbnNmZXIgaGFzIHBvc3RlZC4gIEZvciBgYWNoYCBvciBgc2FtZS1kYXktYWNoYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIEFDSCB0cmFjZSBudW1iZXIuIEZvciBgcnRwYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIFRyYW5zYWN0aW9uIElkZW50aWZpY2F0aW9uIG51bWJlci4gRm9yIGB3aXJlYCB0cmFuc2ZlcnMsIHRoaXMgaXMgdGhlIElNQUQgKElucHV0IE1lc3NhZ2UgQWNjb3VudGFiaWxpdHkgRGF0YSkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgbmV0d29ya190cmFjZV9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2ZlciB0byByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSByZWZ1bmQgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSByZWZ1bmQuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSByZWZ1bmQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgcmVmdW5kIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVmdW5kfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kOiBUcmFuc2ZlclJlZnVuZDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBldmVudCB0eXBlIGZvciBhIHJlZnVuZCBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV0dXJuZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kRmFpbHVyZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZhaWx1cmUgY29kZSwgZS5nLiBgUjAxYC4gIEEgZmFpbHVyZSBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHJlZnVuZCBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSByZWZ1bmQgc3RhdHVzIGlzIGByZXR1cm5lZGAuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiBBQ0ggcmV0dXJuIGNvZGVzLCBzZWUgW1RyYW5zZmVyIGVycm9yc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI2FjaC1yZXR1cm4tY29kZXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWZ1bmQuICBgcGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGhhdmUgYmVlbiByZWZ1bmRlZCB0byB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gYGZhaWxlZGA6IFRoZSByZWZ1bmQgaGFzIGZhaWxlZC4gYHJldHVybmVkYDogVGhlIHJlZnVuZCB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlZnVuZFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIEEgcmVwYXltZW50IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhZnRlciBvbmUgb3IgbW9yZSBndWFyYW50ZWVkIHRyYW5zYWN0aW9ucyByZWNlaXZlIGEgcmV0dXJuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxpZ2libGUgcmV0dXJucyBpbiBhIGRheSwgdGhleSBhcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlIHJlcGF5bWVudC4gIFJlcGF5bWVudHMgYXJlIHNlbnQgb3ZlciBBQ0gsIHdpdGggZnVuZHMgdHlwaWNhbGx5IGF2YWlsYWJsZSBvbiB0aGUgbmV4dCBiYW5raW5nIGRheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHJlcGF5bWVudCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlY2ltYWwgYW1vdW50IG9mIHRoZSByZXBheW1lbnQgYXMgaXQgYXBwZWFycyBvbiB5b3VyIGFjY291bnQgbGVkZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSByZXBheW1lbnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRzOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0dXJuIG9uIGEgR3VhcmFudGVlZCBBQ0ggdHJhbnNmZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBndWFyYW50ZWVkIHRyYW5zZmVyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYHJldHVybmVkYCB0cmFuc2ZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudCB0byBxdWVyeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnRzL3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9yZXR1cm5zOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gTm90ZSB0aGF0IGZ1bmRzIGZyb20gcmVjZWl2ZWQgZGViaXRzIGFyZSBub3QgYXZhaWxhYmxlIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgTGVkZ2VyIHVudGlsIHRoZSB0cmFuc2ZlciByZWFjaGVzIGBmdW5kc19hdmFpbGFibGVgIHN0YXR1cy4gRm9yIGNyZWRpdCB0cmFuc2FjdGlvbnMsIGBzZXR0bGVkYCBtZWFucyB0aGUgZnVuZHMgaGF2ZSBiZWVuIGRlbGl2ZXJlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgYWNjb3VudC4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBGdW5kc0F2YWlsYWJsZSA9ICdmdW5kc19hdmFpbGFibGUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHN3ZWVwIG9mIGZ1bmRzIHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIEEgc3dlZXAgaXMgYXNzb2NpYXRlZCB3aXRoIG1hbnkgc3dlZXAgZXZlbnRzIChldmVudHMgb2YgdHlwZSBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgKSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYHN3ZWVwX2lkYC4gIGBzd2VwdGAgZXZlbnRzIG9jY3VyIHdoZW4gdGhlIHRyYW5zZmVyIGFtb3VudCBpcyBjcmVkaXRlZCBvciBkZWJpdGVkIGZyb20geW91ciBzd2VlcCBhY2NvdW50LCBkZXBlbmRpbmcgb24gdGhlIGB0eXBlYCBvZiB0aGUgdHJhbnNmZXIuIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIGEgdHJhbnNmZXIgaXMgcmV0dXJuZWQgYW5kIFBsYWlkIHVuZG9lcyB0aGUgY3JlZGl0IG9yIGRlYml0LiAgVGhlIHRvdGFsIHN1bSBvZiB0aGUgYHN3ZXB0YCBhbmQgYHJldHVybl9zd2VwdGAgZXZlbnRzIGlzIGVxdWFsIHRvIHRoZSBgYW1vdW50YCBvZiB0aGUgc3dlZXAgUGxhaWQgY3JlYXRlcyBhbmQgbWF0Y2hlcyB0aGUgYW1vdW50IG9mIHRoZSBlbnRyeSBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFN3ZWVwRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3dlZXAgKFVVSUQpIG9yIGEgc2hvcnRlbmVkIGZvcm0gY29uc2lzdGluZyBvZiB0aGUgZmlyc3QgOCBjaGFyYWN0ZXJzIG9mIHRoZSBpZGVudGlmaWVyICg4LWRpZ2l0IGhleGFkZWNpbWFsIHN0cmluZykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzd2VlcHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBpbmNsdWRlZCBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PFRyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBzd2VlcCBmb3IgdGhlIHRyYW5zZmVyLiAgYHVuc3dlcHRgOiBUaGUgdHJhbnNmZXIgaGFzblxcJ3QgYmVlbiBzd2VwdCB5ZXQuIGBzd2VwdGA6IFRoZSB0cmFuc2ZlciB3YXMgc3dlcHQgdG8gdGhlIHN3ZWVwIGFjY291bnQuIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiBgcmV0dXJuX3N3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdWxsZWQgYmFjayBvciBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGRlYml0cy4gYG51bGxgOiBUaGUgdHJhbnNmZXIgd2lsbCBuZXZlciBiZSBzd2VwdCAoZS5nLiBpZiB0aGUgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIG9yIHJldHVybmVkIGJlZm9yZSBiZWluZyBzd2VwdClcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3dlZXBTdGF0dXMge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgVW5zd2VwdCA9ICd1bnN3ZXB0JyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHRlc3QgY2xvY2sgZm9yIGEgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJUZXN0Q2xvY2sge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeC4gXFxcIlNhbiBGcmFuY2lzY29cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gd2lyZSB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyV2lyZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlcldpcmVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpcmUgb3JpZ2luYXRvciB0byB0aGUgYmVuZWZpY2lhcnkuIE1heCAxNDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlcldpcmVEZXRhaWxzXG4gICAgICovXG4gICAgbWVzc2FnZV90b19iZW5lZmljaWFyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRydXN0ZWQgRGV2aWNlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmV2aW91cyBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRydXN0ZWREZXZpY2VEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJ1c3RlZERldmljZURhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0ZWREZXZpY2VEYXRhXG4gICAgICovXG4gICAgdHJ1c3RfbGV2ZWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RldmljZUlkfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdGVkRGV2aWNlRGF0YVxuICAgICAqL1xuICAgIGRldmljZV9pZD86IERldmljZUlkO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpZGVudGl0eSBkYXRhIHBlcm1pc3Npb25lZCBieSB0aGUgZW5kIHVzZXIgZHVyaW5nIHRoZSBhdXRob3JpemF0aW9uIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eU5hbWV9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lPzogVXNlckFjY291bnRJZGVudGl0eU5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLiAgTm90ZTogZW1haWwgaXMgY3VycmVudGx5IG5vdCByZXR1cm5lZCBmb3IgdXNlcnMsIGFuZCBpcyBhbiB1cGNvbWluZyBhZGRpdGlvbiB0aGF0IHdpbGwgYmUgbGl2ZSBpbiBlYXJseSAyMDI1LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGRhdGUgb2YgYmlydGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDQgZGlnaXRzIG9mIHRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc25fbGFzdF80Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kIGxpbmUgc3RyZWV0IGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5TmFtZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBJdGVtIGNyZWF0ZWQgZHVyaW5nIGEgTGF5ZXIgYXV0aG9yaXphdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYCB3ZWJob29rIGlzIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIENoYXNlIGFuZCBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRoYXQgYWxsb3cgYWNjb3VudC1sZXZlbCBwZXJtaXNzaW9ucyByZXZvY2F0aW9uIHRocm91Z2ggdGhlaXIgcG9ydGFscy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IFBsYWlkLWRlcml2ZWQgZGF0YSB5b3UgaGF2ZSBzdG9yZWQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJldm9rZWQgYWNjb3VudC4gIElmIHlvdSBhcmUgdXNpbmcgQXV0aCBhbmQgcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgdGhhdCB0aGUgVEFOIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV2b2tlZCBhY2NvdW50IGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIG5ldyB0cmFuc2ZlcnMuIFlvdSBzaG91bGQgbm90IGNyZWF0ZSBuZXcgQUNIIHRyYW5zZmVycyBmb3IgdGhlIGFjY291bnQgdGhhdCB3YXMgcmV2b2tlZCB1bnRpbCBhY2Nlc3MgaGFzIGJlZW4gcmUtZ3JhbnRlZC4gIFlvdSBjYW4gcmVxdWVzdCB0aGUgdXNlciB0byByZS1ncmFudCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBieSBzZW5kaW5nIHRoZW0gdGhyb3VnaCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBBbHRlcm5hdGl2ZWx5LCB0aGV5IG1heSByZS1ncmFudCBhY2Nlc3MgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiAgQWZ0ZXIgdGhlIHVzZXIgaGFzIHJlLWdyYW50ZWQgYWNjZXNzLCBBdXRoIGN1c3RvbWVycyBzaG91bGQgY2FsbCB0aGUgYXV0aCBlbmRwb2ludCBhZ2FpbiB0byBvYnRhaW4gdGhlIG5ldyBUQU4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfQUNDT1VOVF9SRVZPS0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBlbmQgdXNlciBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHk6IFVzZXJBY2NvdW50SWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxVc2VyQWNjb3VudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxVc2VyQWNjb3VudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgdXNlci4gU3VwcG9ydGVkIHZhbHVlcyBhcmU6IG5vdCBwcm92aWRlZCwgYWRkcmVzcyB3aXRoIG9ubHkgY291bnRyeSBjb2RlIG9yIGZ1bGwgYWRkcmVzcy4gIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuIElmIHByb3ZpZGVkLCBhIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDUwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgYSBDUkEgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGFPdmVydmlldyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLiBGb3Igc3BlY2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cyBieSBJRCB0eXBlLCBzZWUgW0h5YnJpZCBJbnB1dCBWYWxpZGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBVc2VySXRlbXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckl0ZW1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckl0ZW1zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbT59XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGAgd2ViaG9vayBtYXkgYmUgZmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBJZiB0aGUgZW5kIHVzZXIgcmV2b2tlZCB0aGVpciBwZXJtaXNzaW9ucyB0aHJvdWdoIFBsYWlkIChzdWNoIGFzIHZpYSB0aGUgUGxhaWQgUG9ydGFsIG9yIGJ5IGNvbnRhY3RpbmcgUGxhaWQgU3VwcG9ydCksIHRoZSB3ZWJob29rIHdpbGwgZmlyZS4gSWYgdGhlIGVuZCB1c2VyIHJldm9rZWQgdGhlaXIgcGVybWlzc2lvbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW5zdGl0dXRpb24sIHRoaXMgd2ViaG9vayBtYXkgbm90IGFsd2F5cyBmaXJlLCBzaW5jZSBzb21lIGluc3RpdHV0aW9uc+KAmSBjb25zZW50IHBvcnRhbHMgZG8gbm90IHRyaWdnZXIgdGhpcyB3ZWJob29rLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFRvIHJlc3RvcmUgdGhlIEl0ZW0sIGl0IGNhbiBiZSBzZW50IHRocm91Z2ggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgIE5vdGUgdGhhdCB3aGVuIHdvcmtpbmcgd2l0aCB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIHdpdGggQXV0aCBvciBUcmFuc2ZlciwgdGhlIGFjY291bnQgbnVtYmVyIHByb3ZpZGVkIGJ5IFBsYWlkIHdpbGwgbm8gbG9uZ2VyIHdvcmsgZm9yIGNyZWF0aW5nIHRyYW5zZmVycyBvbmNlIHVzZXIgcGVybWlzc2lvbiBoYXMgYmVlbiByZXZva2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBVc2VyUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlclJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIGNhdGVnb3J5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlQ2F0ZWdvcnkge1xuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBVbmVtcGxveW1lbnQgPSAnVU5FTVBMT1lNRU5UJyxcbiAgICBDYXNoID0gJ0NBU0gnLFxuICAgIEdpZ0Vjb25vbXkgPSAnR0lHX0VDT05PTVknLFxuICAgIFJlbnRhbCA9ICdSRU5UQUwnLFxuICAgIENoaWxkU3VwcG9ydCA9ICdDSElMRF9TVVBQT1JUJyxcbiAgICBNaWxpdGFyeSA9ICdNSUxJVEFSWScsXG4gICAgUmV0aXJlbWVudCA9ICdSRVRJUkVNRU5UJyxcbiAgICBMb25nVGVybURpc2FiaWxpdHkgPSAnTE9OR19URVJNX0RJU0FCSUxJVFknLFxuICAgIEJhbmtJbnRlcmVzdCA9ICdCQU5LX0lOVEVSRVNUJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgZnJlcXVlbmN5IG9mIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3kge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgdHlwZSAtIGBHUk9TU2AsIGBORVRgLCBvciBgVU5LTk9XTmAgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEdyb3NzID0gJ0dST1NTJyxcbiAgICBOZXQgPSAnTkVUJ1xufVxuXG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBBUEkgYGNsaWVudF9pZGAgb2YgdGhlIHRoaXJkLXBhcnR5IGNsaWVudCB0aGUgdG9rZW4gd2lsbCBiZSBzaGFyZWQgd2l0aC4gVGhlIHRva2VuIHdpbGwgb25seSBiZSB2YWxpZCBmb3IgdGhlIHNwZWNpZmllZCBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiBkYXRlIGFuZCB0aW1lIGZvciB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGUgZXhwaXJhdGlvbiBpcyByZXN0cmljdGVkIHRvIGEgbWF4aW11bSBvZiAyNCBob3VycyBmcm9tIHRoZSB0b2tlblxcJ3MgY3JlYXRpb24gdGltZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgdG9rZW4gd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGlyZSBhZnRlciAyNCBob3Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fdGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWYWxpZGF0aW9uU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VcbiAgICAgKi9cbiAgICBWYWxpZGF0aW9uU291cmNlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VSZWZlcmVuY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VmFsaWRhdGlvblNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VzXG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0U6IEFycmF5PFZhbGlkYXRpb25Tb3VyY2U+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHNldmVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IFJlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQXNzZXRzO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9OT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFN0YXR1c1VzZXJQcmVzZW5jZVJlcXVpcmVkID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEJyxcbiAgICBTdWNjZXNzZnVsID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUwnLFxuICAgIE5vdEZvdW5kID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZ5U01TRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVNNU0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZnlTTVNEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBWZXJpZnlTTVNEZXRhaWxzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhIHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlci1zdWJtaXR0ZWQgcGhvbmUgbnVtYmVyLiBQaG9uZSBudW1iZXIgZWRpdHMsIGFuZCBpbiBzb21lIGNhc2VzIGVycm9yIGhhbmRsaW5nIGR1ZSB0byBlZGdlIGNhc2VzIGxpa2UgcmF0ZSBsaW1pdGluZywgbWF5IGdlbmVyYXRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U01TVmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZ5U01TRGV0YWlsc1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbnM6IEFycmF5PFNNU1ZlcmlmaWNhdGlvbj47XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGB2ZXJpZnlfc21zYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnZlcmlmeV9zbXNgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZ5U01TRGV0YWlsc1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBzZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJPdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgc2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94Xzk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG90aGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlPjtcbn1cbi8qKlxuICogVzIgc3RhdGUgYW5kIGxvY2FsIHdhZ2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxpdHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xufVxuLyoqXG4gKiBXYWxsZXRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUsIHVzZWQgd2l0aCBlLXdhbGxldHMgYW5kIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldElTT0N1cnJlbmN5Q29kZSB7XG4gICAgR2JwID0gJ0dCUCcsXG4gICAgRXVyID0gJ0VVUidcbn1cblxuLyoqXG4gKiBXYWxsZXRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCBlLXdhbGxldCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gZS13YWxsZXRzIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZS13YWxsZXQuIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gZS13YWxsZXRzIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGUtd2FsbGV0cyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdhbGxldExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZS13YWxsZXRzXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldD59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldHM6IEFycmF5PFdhbGxldD47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IGUtd2FsbGV0IHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbElCQU59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgc2NoZW1lIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBBWU9VVGAgYW5kIGBSRUZVTkRgLiAgYEZBU1RFUl9QQVlNRU5UU2A6IFRoZSBzdGFuZGFyZCBwYXltZW50IHNjaGVtZSB3aXRoaW4gdGhlIFVLLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEZhc3RlclBheW1lbnRzID0gJ0ZBU1RFUl9QQVlNRU5UUycsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgd2FsbGV0LiAgYFVOS05PV05gOiBUaGUgd2FsbGV0IHN0YXR1cyBpcyB1bmtub3duLiAgYEFDVElWRWA6IFRoZSB3YWxsZXQgaXMgYWN0aXZlIGFuZCByZWFkeSB0byBzZW5kIG1vbmV5IHRvIGFuZCByZWNlaXZlIG1vbmV5IGZyb20uICBgQ0xPU0VEYDogVGhlIHdhbGxldCBpcyBjbG9zZWQuIEFueSB0cmFuc2FjdGlvbnMgbWFkZSB0byBvciBmcm9tIHRoaXMgd2FsbGV0IHdpbGwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgQ2xvc2VkID0gJ0NMT1NFRCdcbn1cblxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogV2FsbGV0VHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBpZCB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IGZvciB0cmFuc2FjdGlvbiB0eXBlcyBgUElTX1BBWV9JTmAgYW5kIGBSRUZVTkRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHdhbGxldCB0cmFuc2FjdGlvbnMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LlxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWxhdGVkX3RyYW5zYWN0aW9ucz86IEFycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWNhbGwgPSAnUkVDQUxMJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgZm9yIGEgV2FsbGV0IFRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDUztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsIHwgbnVsbDtcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuIEVuc3VyZSB0aGF0IHRoZSBgcmVmZXJlbmNlYCBmaWVsZCBpcyB1bmlxdWUgZm9yIGVhY2ggdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlcnJvciBjb2RlIG9mIGEgZmFpbGVkIHRyYW5zYWN0aW9uLiBFcnJvciBjb2RlcyBpbmNsdWRlOiBgRVhURVJOQUxfU1lTVEVNYDogVGhlIHRyYW5zYWN0aW9uIHdhcyBkZWNsaW5lZCBieSBhbiBleHRlcm5hbCBzeXN0ZW0uIGBFWFBJUkVEYDogVGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QgaGFzIGV4cGlyZWQuIGBDQU5DRUxMRURgOiBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCB3YXMgcmVzY2luZGVkLiBgSU5WQUxJRGA6IFRoZSB0cmFuc2FjdGlvbiBkaWQgbm90IG1lZXQgY2VydGFpbiBjcml0ZXJpYSwgc3VjaCBhcyBhbiBpbmFjdGl2ZSBhY2NvdW50IG9yIG5vIHZhbGlkIGNvdW50ZXJwYXJ0eSwgZXRjLiBgVU5LTk9XTmA6IFRoZSB0cmFuc2FjdGlvbiB3YXMgdW5zdWNjZXNzZnVsLCBidXQgdGhlIGV4YWN0IGNhdXNlIGlzIHVua25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb24ge1xuICAgIEV4dGVybmFsU3lzdGVtID0gJ0VYVEVSTkFMX1NZU1RFTScsXG4gICAgRXhwaXJlZCA9ICdFWFBJUkVEJyxcbiAgICBDYW5jZWxsZWQgPSAnQ0FOQ0VMTEVEJyxcbiAgICBJbnZhbGlkID0gJ0lOVkFMSUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoZSBzdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZXMgdGhhdCBhcmUgcmV0dXJuZWQgYXJlOiBgQkFOS19UUkFOU0ZFUjpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIGFuIGV4dGVybmFsIGJhbmsgdHJhbnNmZXIuICBgUEFZT1VUOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgZGlzYnVyc2luZyBmdW5kcyB0byBhIGNvdW50ZXJwYXJ0eS4gIGBQSVNfUEFZX0lOOmAgYSBwYXltZW50IHdoaWNoIGNyZWRpdHMgYW4gZS13YWxsZXQgdGhyb3VnaCBQbGFpZFxcJ3MgUGF5bWVudCBJbml0aWF0aW9uIFNlcnZpY2VzIChQSVMpIEFQSXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgW1BheW1lbnQgSW5pdGlhdGlvbiBlbmRwb2ludHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYFJFRlVORDpgIGEgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGFuIGUtd2FsbGV0IGJ5IHJlZnVuZGluZyBhIHByZXZpb3VzbHkgaW5pdGlhdGVkIHBheW1lbnQgbWFkZSB0aHJvdWdoIFBsYWlkXFwncyBbUElTIEFQSXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8pLiAgYEZVTkRTX1NXRUVQYDogYW4gYXV0b21hdGVkIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBmdW5kcyBmcm9tIGFuIGUtd2FsbGV0IHRvIGEgZGVzaWduYXRlZCBjbGllbnQtb3duZWQgYWNjb3VudC4gIGBSRVRVUk5gOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hlcmUgYSBkZWJpdCB0cmFuc2FjdGlvbiB3YXMgcmV2ZXJzZWQgYW5kIG1vbmV5IG1vdmVkIGJhY2sgdG8gb3JpZ2luYXRpbmcgYWNjb3VudC4gIGBSRUNBTExgOiBhIHRyYW5zYWN0aW9uIHdoZXJlIHRoZSBzZW5kaW5nIGJhbmsgaGFzIHJlcXVlc3RlZCB0aGUgcmV0dXJuIG9mIGZ1bmRzIGR1ZSB0byBhIGZyYXVkIGNsYWltLCB0ZWNobmljYWwgZXJyb3IsIG9yIG90aGVyIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZTogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZW1lPzogV2FsbGV0UGF5bWVudFNjaGVtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50OiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX3VwZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGlkIHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgZm9yIHRyYW5zYWN0aW9uIHR5cGVzIGBQSVNfUEFZX0lOYCBhbmQgYFJFRlVORGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkZhaWx1cmVSZWFzb259XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHdhbGxldCB0cmFuc2FjdGlvbnMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LlxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF0ZWRfdHJhbnNhY3Rpb25zPzogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVR5cGVFbnVtIHtcbiAgICBCYW5rVHJhbnNmZXIgPSAnQkFOS19UUkFOU0ZFUicsXG4gICAgUGF5b3V0ID0gJ1BBWU9VVCcsXG4gICAgUGlzUGF5SW4gPSAnUElTX1BBWV9JTicsXG4gICAgUmVmdW5kID0gJ1JFRlVORCcsXG4gICAgRnVuZHNTd2VlcCA9ICdGVU5EU19TV0VFUCcsXG4gICAgUmV0dXJuID0gJ1JFVFVSTicsXG4gICAgUmVjYWxsID0gJ1JFQ0FMTCdcbn1cblxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGF0IHRyYW5zYWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRyYW5zYWN0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2hcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQWRkaXRpb25hbCB3YWxsZXQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXJ0X3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRoaDptbTpzc1opIGZvciBmaWx0ZXJpbmcgdHJhbnNhY3Rpb25zLCBpbmNsdXNpdmUgb2YgdGhlIHByb3ZpZGVkIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiB0cmFuc2FjdGlvbnMgb2YgYW4gZS13YWxsZXQsIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYHdhbGxldF9pZGBcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8V2FsbGV0VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEN1cnNvciB1c2VkIGZvciBmZXRjaGluZyB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiBwcm92aWRlZCBpbiB0aGlzIHJlc3BvbnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9ucyBhcmUgcmVsYXRlZCB3aGVuIHRoZXkgaGF2ZSBhIGxvZ2ljYWwgY29ubmVjdGlvbi4gIEZvciBleGFtcGxlLCBhIGBQQVlPVVRgIHRyYW5zYWN0aW9uIGNhbiBiZSByZXR1cm5lZCBieSB0aGUgc2VuZGVyLCBjcmVhdGluZyBhIGBSRVRVUk5gIHRyYW5zYWN0aW9uLiBFYWNoIGBQQVlPVVRgIHRyYW5zYWN0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGNvcnJlc3BvbmRpbmcgYFJFVFVSTmAgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiByZXZlcnNhbC4gIFRoZXNlIHJlbGF0aW9uc2hpcHMgYXJlIGJpLWRpcmVjdGlvbmFsLCBtZWFuaW5nIHRoYXQgYm90aCBlbnRpdGllcyBoYXZlIHJlZmVyZW5jZXMgdG8gZWFjaCBvdGhlci4gRm9yIGluc3RhbmNlLCB3aGVuIGEgdHJhbnNhY3Rpb24gb2YgdHlwZSBSRVRVUk4gb2NjdXJzLCBpdCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGJlaW5nIHJldHVybmVkLiBMaWtld2lzZSwgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIGhhcyBhIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBSRVRVUk4gdHJhbnNhY3Rpb24gdGhhdCByZXByZXNlbnRzIHRoZSByZXR1cm4uICAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgdHJhbnNhY3Rpb25zIG9mIHR5cGUgYFJFVFVSTmAsIGBGVU5EU19TV0VFUGAsIGBSRUZVTkRgIGFuZCBgUEFZT1VUYC4gIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIGBQSVNfUEFZX0lOYCBwYXltZW50IGFuZCBpdHMgY29ycmVzcG9uZGluZyBgUkVGVU5EYCB0cmFuc2FjdGlvbnMgaXMgb25seSBhdmFpbGFibGUgdGhyb3VnaCBgcmVmdW5kX2lkc2AgcHJvcGVydHkgaW4gdGhlIHBheW1lbnQgb2JqZWN0LiBTZWVbYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWdldC1yZXNwb25zZS1yZWZ1bmQtaWRzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVsYXRlZCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb25cbiAgICAgKi9cbiAgICB0eXBlPzogV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb25UeXBlRW51bSB7XG4gICAgUGF5b3V0ID0gJ1BBWU9VVCcsXG4gICAgUmV0dXJuID0gJ1JFVFVSTicsXG4gICAgUmVmdW5kID0gJ1JFRlVORCcsXG4gICAgRnVuZHNTd2VlcCA9ICdGVU5EU19TV0VFUCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2FjdGlvbi4gIGBBVVRIT1JJU0lOR2A6IFRoZSB0cmFuc2FjdGlvbiBpcyBiZWluZyBwcm9jZXNzZWQgZm9yIHZhbGlkYXRpb24gYW5kIGNvbXBsaWFuY2UuICBgSU5JVElBVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZCBhbmQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIGBFWEVDVVRFRGA6IFRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgYW5kIGlzIGNvbnNpZGVyZWQgY29tcGxldGUuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBkZWJpdCB0cmFuc2FjdGlvbnMuICBgU0VUVExFRGA6IFRoZSB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBhbmQgZnVuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgY3JlZGl0IHRyYW5zYWN0aW9ucy4gQSB0cmFuc2FjdGlvbiB3aWxsIHR5cGljYWxseSBzZXR0bGUgd2l0aGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gd2hpY2ggcGF5bWVudCByYWlsIGlzIHVzZWQuICBgRkFJTEVEYDogVGhlIHRyYW5zYWN0aW9uIGZhaWxlZCB0byBwcm9jZXNzIHN1Y2Nlc3NmdWxseS4gVGhpcyBpcyBhIHRlcm1pbmFsIHN0YXR1cy4gIGBCTE9DS0VEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGJsb2NrZWQgZm9yIHZpb2xhdGluZyBjb21wbGlhbmNlIHJ1bGVzLiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXMge1xuICAgIEF1dGhvcmlzaW5nID0gJ0FVVEhPUklTSU5HJyxcbiAgICBJbml0aWF0ZWQgPSAnSU5JVElBVEVEJyxcbiAgICBFeGVjdXRlZCA9ICdFWEVDVVRFRCcsXG4gICAgU2V0dGxlZCA9ICdTRVRUTEVEJyxcbiAgICBCbG9ja2VkID0gJ0JMT0NLRUQnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBXQUxMRVRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFdBTExFVF9UUkFOU0FDVElPTl9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdHJhbnNhY3Rpb25faWRgIGZvciB0aGUgd2FsbGV0IHRyYW5zYWN0aW9uIGJlaW5nIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyB3aWxsIGJlIHByZXNlbnQgaW4gY2FzZSBvZiBgUkVGVU5EYCBhbmQgYFBJU19QQVlfSU5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHBheW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBFTUkgKEUtTW9uZXkgSW5zdGl0dXRpb24pIHdhbGxldCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGguIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19zdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb2xkX3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgdXBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQsIGUuZy4gYFxcXCIyMDE3LTA5LTE0VDE0OjQyOjE5LjM1MFpcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZmV0Y2ggdHJhbnNhY3Rpb25zIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYmFzZTY0IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWQuIFNldCB0aGlzIHRvIGBuZXh0X2N1cnNvcmAgcmVjZWl2ZWQgZnJvbSB0aGUgcHJldmlvdXMgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGAgcmVxdWVzdC4gSWYgcHJvdmlkZWQsIHRoZSByZXNwb25zZSB3aWxsIG9ubHkgY29udGFpbiB0cmFuc2FjdGlvbnMgY3JlYXRlZCBiZWZvcmUgdGhhdCB0cmFuc2FjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0cmFuc2FjdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgbW9zdCByZWNlbnQsIGFuZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhbiBBc3NldCBSZXBvcnQgdG8gYmUgcmV0dXJuZWQgd2l0aCBtaXNzaW5nIGFjY291bnQgb3duZXIgaW5mb3JtYXRpb24uIEluIHN1Y2ggY2FzZXMsIHRoZSBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXJuaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIHdhcm5pbmcgdHlwZSwgd2hpY2ggd2lsbCBhbHdheXMgYmUgYEFTU0VUX1JFUE9SVF9XQVJOSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBPV05FUlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IGFjY291bnQtb3duZXIgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS5gSU5WRVNUTUVOVFNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IEludmVzdG1lbnRzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuIGBUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEVgIGluZGljYXRlcyB0aGF0IHRyYW5zYWN0aW9ucyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggQ3JlZGl0IGFuZCBEZXBvc2l0b3J5IGFjY291bnRzIGFyZSB1bmF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBXYXJuaW5nV2FybmluZ0NvZGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FybmluZ1dhcm5pbmdDb2RlRW51bSB7XG4gICAgT3duZXJzVW5hdmFpbGFibGUgPSAnT1dORVJTX1VOQVZBSUxBQkxFJyxcbiAgICBJbnZlc3RtZW50c1VuYXZhaWxhYmxlID0gJ0lOVkVTVE1FTlRTX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgY2hhbmdlIG1hZGUgdG8gdGhlIHBhcmVudCBvYmplY3Qgc3BlY2lmeWluZyB3aGF0IGNhdXNlZCB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgd2hlbiBpdCBvY2N1cnJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IFNvdXJjZTtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBkYXNoYm9hcmRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlydGhfY2VydGlmaWNhdGVgIC0gQSBjZXJ0aWZpY2F0ZSBvZiBiaXJ0aCAgYGRyaXZlcnNfbGljZW5zZWAgLSBBIGxpY2Vuc2UgdG8gb3BlcmF0ZSBhIG1vdG9yIHZlaGljbGUgIGBpbW1pZ3JhdGlvbl9udW1iZXJgIC0gSW1taWdyYXRpb24gb3IgcmVzaWRlbmNlIGRvY3VtZW50cyAgYG1pbGl0YXJ5X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBieSBhIG1pbGl0YXJ5IGdyb3VwICBgb3RoZXJgIC0gQW55IGRvY3VtZW50IG5vdCBjb3ZlcmVkIGJ5IG90aGVyIGNhdGVnb3JpZXMgIGBwYXNzcG9ydGAgLSBBbiBvZmZpY2lhbCBwYXNzcG9ydCBpc3N1ZSBieSBhIGdvdmVybm1lbnQgIGBwZXJzb25hbF9pZGVudGlmaWNhdGlvbmAgLSBBbnkgZ2VuZXJpYyBwZXJzb25hbCBpZGVudGlmaWNhdGlvbiB0aGF0IGlzIG5vdCBjb3ZlcmVkIGJ5IG90aGVyIGNhdGVnb3JpZXMgIGByYXRpb25fY2FyZGAgLSBJZGVudGlmaWNhdGlvbiB0aGF0IGVudGl0bGVzIHRoZSBob2xkZXIgdG8gcmF0aW9ucyAgYHNzbmAgLSBVbml0ZWQgU3RhdGVzIFNvY2lhbCBTZWN1cml0eSBOdW1iZXIgIGBzdHVkZW50X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBieSBhbiBlZHVjYXRpb25hbCBpbnN0aXR1dGlvbiAgYHRheF9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbGxlY3RpbmcgdGF4ZXMgIGB0cmF2ZWxfZG9jdW1lbnRgIC0gVmlzYXMsIGVudHJ5IHBlcm1pdHMsIHJlZnVnZWUgZG9jdW1lbnRzLCBldGMuICBgdm90ZXJfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiB2b3RpbmdcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50VHlwZSB7XG4gICAgQmlydGhDZXJ0aWZpY2F0ZSA9ICdiaXJ0aF9jZXJ0aWZpY2F0ZScsXG4gICAgRHJpdmVyc0xpY2Vuc2UgPSAnZHJpdmVyc19saWNlbnNlJyxcbiAgICBJbW1pZ3JhdGlvbk51bWJlciA9ICdpbW1pZ3JhdGlvbl9udW1iZXInLFxuICAgIE1pbGl0YXJ5SWQgPSAnbWlsaXRhcnlfaWQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXNzcG9ydCA9ICdwYXNzcG9ydCcsXG4gICAgUGVyc29uYWxJZGVudGlmaWNhdGlvbiA9ICdwZXJzb25hbF9pZGVudGlmaWNhdGlvbicsXG4gICAgUmF0aW9uQ2FyZCA9ICdyYXRpb25fY2FyZCcsXG4gICAgU3NuID0gJ3NzbicsXG4gICAgU3R1ZGVudElkID0gJ3N0dWRlbnRfaWQnLFxuICAgIFRheElkID0gJ3RheF9pZCcsXG4gICAgVHJhdmVsRG9jdW1lbnQgPSAndHJhdmVsX2RvY3VtZW50JyxcbiAgICBWb3RlcklkID0gJ3ZvdGVyX2lkJ1xufVxuXG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSBzY3JlZW5pbmcgcmV2aWV3XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGNoYW5nZXMgdG8gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgaGl0cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzaWduZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGVudGl0aWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxFbnRpdHlXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEVudGl0eVdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIGVudGl0eSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgT3JnYW5pemF0aW9uc1xcXCIgb3IgXFxcIkFwcGxpY2FudHNcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQXJjaGl2ZWQgcHJvZ3JhbXMgYXJlIHJlYWQtb25seSBhbmQgY2Fubm90IHNjcmVlbiBuZXcgY3VzdG9tZXJzIG5vciBwYXJ0aWNpcGF0ZSBpbiBvbmdvaW5nIG1vbml0b3JpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RQcm9ncmFtPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbXM6IEFycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHJldmlld3MgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHJldmlld3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHJldmlld3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3Pn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfcmV2aWV3czogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZWRpdGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zPzogVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZmllbGRzIHRvIHJlc2V0IGJhY2sgdG8gbnVsbFxuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+IHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG5hbWUgb2YgYSBmaWVsZCB0aGF0IGNhbiBiZSByZXNldCBiYWNrIHRvIG51bGxcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgZnJvbSBhIGdvdmVybm1lbnQgd2F0Y2hsaXN0IG9yIFBFUCBsaXN0IHRoYXQgaGFzIGJlZW4gYXR0YWNoZWQgdG8gdGhlIHNjcmVlbmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZGl2aWR1YWxXYXRjaGxpc3RDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBsaXN0X2NvZGU6IEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pdmVyc2FsIGlkZW50aWZpZXIgZm9yIGEgd2F0Y2hsaXN0IGluZGl2aWR1YWwgdGhhdCBpcyBzdGFibGUgYWNyb3NzIHNlYXJjaGVzIGFuZCB1cGRhdGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHBsYWlkX3VpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2Ugc2FuY3Rpb24gb3Igd2F0Y2hsaXN0LiBXaGVuIG9uZSBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSwgdGhpcyBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgc291cmNlX3VpZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGFuYWx5c2lzPzogU2NyZWVuaW5nSGl0QW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NjcmVlbmluZ0hpdERhdGF9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGRhdGE/OiBTY3JlZW5pbmdIaXREYXRhO1xufVxuLyoqXG4gKiBMb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgbG9jYXRpb24gc3RyaW5nLCBwb3RlbnRpYWxseSBpbmNsdWRpbmcgZWxlbWVudHMgbGlrZSBzdHJlZXQsIGNpdHksIHBvc3RhbCBjb2RlcyBhbmQgY291bnRyeSBjb2Rlcy4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGEgY29tcGxldGUgb3Igd2VsbC1mb3JtYXR0ZWQgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBmdWxsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHJldmlldy4gQWxsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0cyBiZWdpbiBpbiBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUgYnV0IGNhbiBiZSBjaGFuZ2VkIGJ5IGNyZWF0aW5nIGEgcmV2aWV3LiBXaGVuIGEgaGl0IGlzIGluIHRoZSBgcGVuZGluZ19yZXZpZXdgIHN0YXRlLCBpdCB3aWxsIGFsd2F5cyBzaG93IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgd2F0Y2hsaXN0IGRhdGEgUGxhaWQgaGFzIGF2YWlsYWJsZSBhbmQgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgbGF0ZXN0IGN1c3RvbWVyIGluZm9ybWF0aW9uIHNhdmVkIGluIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBPbmNlIGEgaGl0IGhhcyBiZWVuIG1hcmtlZCBhcyBgY29uZmlybWVkYCBvciBgZGlzbWlzc2VkYCBpdCB3aWxsIG5vIGxvbmdlciBiZSB1cGRhdGVkIHNvIHRoYXQgdGhlIHN0YXRlIGlzIGFzIGl0IHdhcyB3aGVuIHRoZSByZXZpZXcgd2FzIGZpcnN0IGNvbmR1Y3RlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1cyB7XG4gICAgQ29uZmlybWVkID0gJ2NvbmZpcm1lZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgRGlzbWlzc2VkID0gJ2Rpc21pc3NlZCdcbn1cblxuLyoqXG4gKiBUaGUgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhIGN1c3RvbWVyIGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgdGhlaXIgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgdGhlbSBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGN1c3RvbWVycyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWwge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIGhpdHMgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhpdHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSGl0Pn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaGl0czogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSGl0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5naW5nIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzaWduZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3QgcHJvZ3JhbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHByb2dyYW0gdGhhdCBjb25maWd1cmVzIHRoZSBhY3RpdmUgbGlzdHMsIHNlYXJjaCBwYXJhbWV0ZXJzLCBhbmQgb3RoZXIgYmVoYXZpb3IgZm9yIGluaXRpYWwgYW5kIG9uZ29pbmcgc2NyZWVuaW5nIG9mIGluZGl2aWR1YWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlzdHNfZW5hYmxlZDogU2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPjtcbiAgICAvKipcbiAgICAgKiBBIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHRvIGRlZmluZSBpdHMgcHVycG9zZS4gRm9yIGV4YW1wbGUsIFxcXCJIaWdoIFJpc2sgSW5kaXZpZHVhbHNcXFwiLCBcXFwiVVMgQ2FyZGhvbGRlcnNcXFwiLCBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBsaXN0aW5nIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXMgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8SW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSBzY3JlZW5pbmcgcmV2aWV3XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIHRvIG1hcmsgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzaWduZWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWVsZHMgdG8gcmVzZXQgYmFjayB0byBudWxsXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXNldF9maWVsZHM/OiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZD4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZpZWxkIHRoYXQgY2FuIGJlIHJlc2V0IGJhY2sgdG8gbnVsbFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQge1xuICAgIEFzc2lnbmVlID0gJ2Fzc2lnbmVlJ1xufVxuXG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJldmlldyBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb25maXJtZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbW1lbnQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc2VhcmNoIHRlcm1zLiBTdGFydHMgYXQgYDFgIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBlZGl0IHRvIGBzZWFyY2hfdGVybXNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHNjcmVlbmluZyBpcyBzdGlsbCBwZW5kaW5nIHJldmlldywgaGFzIGJlZW4gcmVqZWN0ZWQsIG9yIGhhcyBiZWVuIGNsZWFyZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXMge1xuICAgIFJlamVjdGVkID0gJ3JlamVjdGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBDbGVhcmVkID0gJ2NsZWFyZWQnXG59XG5cbi8qKlxuICogTmFtZXMgdGhhdCBhcmUgZXhwbGljaXRseSBtYXJrZWQgYXMgbG93IHF1YWxpdHkgZWl0aGVyIGJ5IHRoZWlyIGBzb3VyY2VgIGxpc3QsIG9yIGJ5IGBwbGFpZGAgYnkgYSBzZXJpZXMgb2YgYWRkaXRpb25hbCBjaGVja3MgZG9uZSBieSBQbGFpZC4gUGxhaWQgZG9lcyBub3QgZXZlciBzdXJmYWNlIGEgaGl0IGFzIGEgcmVzdWx0IG9mIGEgd2VhayBuYW1lIGFsb25lLiBJZiBhIG5hbWUgaGFzIG5vIHF1YWxpdHkgaXNzdWVzLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG5vbmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbiB7XG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBTb3VyY2UgPSAnc291cmNlJyxcbiAgICBQbGFpZCA9ICdwbGFpZCdcbn1cblxuLyoqXG4gKiBUaGUgUGxhaWQgZW52aXJvbm1lbnQgdGhlIHdlYmhvb2sgd2FzIHNlbnQgZnJvbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2ViaG9va0Vudmlyb25tZW50VmFsdWVzIHtcbiAgICBTYW5kYm94ID0gJ3NhbmRib3gnLFxuICAgIFByb2R1Y3Rpb24gPSAncHJvZHVjdGlvbidcbn1cblxuLyoqXG4gKiBUaGUgd2ViaG9vayB0eXBlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWJob29rVHlwZSB7XG4gICAgQXV0aCA9ICdBVVRIJyxcbiAgICBIb2xkaW5ncyA9ICdIT0xESU5HUycsXG4gICAgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnMgPSAnSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TJyxcbiAgICBJdGVtID0gJ0lURU0nLFxuICAgIExpYWJpbGl0aWVzID0gJ0xJQUJJTElUSUVTJyxcbiAgICBUcmFuc2FjdGlvbnMgPSAnVFJBTlNBQ1RJT05TJyxcbiAgICBBc3NldHMgPSAnQVNTRVRTJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3Mgd2ViaG9vayBpcyB1cGRhdGVkLiBUaGlzIHdpbGwgYmUgc2VudCB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV3IHdlYmhvb2sgVVJMXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBJRCAoIGBraWRgICkgZnJvbSB0aGUgSldUIGhlYWRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGtleV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0pXS1B1YmxpY0tleX1cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAga2V5OiBKV0tQdWJsaWNLZXk7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIHByZS10YXggZWFybmluZ3MsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBZVERHcm9zc0luY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogWWVhci10by1kYXRlIGVhcm5pbmdzIGFmdGVyIGFueSB0YXggd2l0aGhvbGRpbmdzLCBiZW5lZml0IHBheW1lbnRzIG9yIGRlZHVjdGlvbnMsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRETmV0SW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBmaXhlZCBpbmNvbWUgc2VjdXJpdHlcXCdzIGV4cGVjdGVkIHJhdGUgb2YgcmV0dXJuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBZaWVsZFJhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZaWVsZFJhdGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXhlZCBpbmNvbWUgc2VjdXJpdHlcXCdzIGV4cGVjdGVkIHJhdGUgb2YgcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFlpZWxkUmF0ZVxuICAgICAqL1xuICAgIHBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7WWllbGRSYXRlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgWWllbGRSYXRlXG4gICAgICovXG4gICAgdHlwZTogWWllbGRSYXRlVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIHJhdGUgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGUgcHJlZGljdGVkIHlpZWxkIHdhcyBjYWxjdWxhdGVkLiBJdCBpcyBvbmUgb2Y6ICBgY291cG9uYDogdGhlIGFubnVhbGl6ZWQgaW50ZXJlc3QgcmF0ZSBmb3Igc2VjdXJpdGllcyB3aXRoIGEgb25lLXllYXIgdGVybSBvciBsb25nZXIsIHN1Y2ggYXMgdHJlYXN1cnkgbm90ZXMgYW5kIGJvbmRzLiAgYGNvdXBvbl9lcXVpdmFsZW50YDogdGhlIGNhbGN1bGF0ZWQgZXF1aXZhbGVudCBmb3IgdGhlIGFubnVhbGl6ZWQgaW50ZXJlc3QgcmF0ZSBmYWN0b3JpbmcgaW4gdGhlIGRpc2NvdW50IHJhdGUgYW5kIHRpbWUgdG8gbWF0dXJpdHksIGZvciBzaG9ydGVyIHRlcm0sIG5vbi1pbnRlcmVzdC1iZWFyaW5nIHNlY3VyaXRpZXMgc3VjaCBhcyB0cmVhc3VyeSBiaWxscy4gIGBkaXNjb3VudGA6IHRoZSByYXRlIGF0IHdoaWNoIHRoZSBwcmVzZW50IHZhbHVlIG9yIGNvc3QgaXMgZGlzY291bnRlZCBmcm9tIHRoZSBmdXR1cmUgdmFsdWUgdXBvbiBtYXR1cml0eSwgYWxzbyBrbm93biBhcyB0aGUgZmFjZSB2YWx1ZS4gIGB5aWVsZGA6IHRoZSB0b3RhbCBwcmVkaWN0ZWQgcmF0ZSBvZiByZXR1cm4gZmFjdG9yaW5nIGluIGJvdGggdGhlIGRpc2NvdW50IHJhdGUgYW5kIHRoZSBjb3Vwb24gcmF0ZSwgYXBwbGljYWJsZSB0byBzZWN1cml0aWVzIHN1Y2ggYXMgZXhjaGFuZ2UtdHJhZGVkIGJvbmRzIHdoaWNoIGNhbiBib3RoIGJlIGludGVyZXN0LWJlYXJpbmcgYXMgd2VsbCBhcyBzb2xkIGF0IGEgZGlzY291bnQgb2ZmIGl0cyBmYWNlIHZhbHVlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gWWllbGRSYXRlVHlwZSB7XG4gICAgQ291cG9uID0gJ2NvdXBvbicsXG4gICAgQ291cG9uRXF1aXZhbGVudCA9ICdjb3Vwb25fZXF1aXZhbGVudCcsXG4gICAgRGlzY291bnQgPSAnZGlzY291bnQnLFxuICAgIFlpZWxkID0gJ3lpZWxkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cblxuLyoqXG4gKiBQbGFpZEFwaSAtIGF4aW9zIHBhcmFtZXRlciBjcmVhdG9yXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0OiBhc3luYyAoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0JhbGFuY2VHZXQnLCAnYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCcsIGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyDigJQgdGhhdCBpcywgYWNjb3VudHMgdGhhdCBhcmUgbm90IGNsb3NlZCBhbmQgYXJlIGNhcGFibGUgb2YgY2FycnlpbmcgYSBiYWxhbmNlLiBUbyByZXR1cm4gbmV3IGFjY291bnRzIHRoYXQgd2VyZSBjcmVhdGVkIGFmdGVyIHRoZSB1c2VyIGxpbmtlZCB0aGVpciBJdGVtLCB5b3UgY2FuIGxpc3RlbiBmb3IgdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFjY291bnRzXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0dldDogYXN5bmMgKGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYWNjb3VudHNHZXQnLCAnYWNjb3VudHNHZXRSZXF1ZXN0JywgYWNjb3VudHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hY2NvdW50cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXBwbGljYXRpb25HZXQ6IGFzeW5jIChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhcHBsaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FwcGxpY2F0aW9uR2V0JywgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcsIGFwcGxpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXBwbGljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGU6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlJywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUdldDogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlOiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZScsICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlOiBhc3luYyAoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydENyZWF0ZScsICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnLCBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyOiBhc3luYyAoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEZpbHRlcicsICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnLCBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldDogYXN5bmMgKGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRHZXQnLCAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JywgYXNzZXRSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UGRmR2V0OiBhc3luYyAoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydFBkZkdldCcsICdhc3NldFJlcG9ydFBERkdldFJlcXVlc3QnLCBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0fSBhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZWZyZXNoOiBhc3luYyAoYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydFJlZnJlc2gnLCAnYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCcsIGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlbW92ZTogYXN5bmMgKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRSZW1vdmUnLCAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGF1dGhHZXQ6IGFzeW5jIChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2F1dGhHZXQnLCAnYXV0aEdldFJlcXVlc3QnLCBhdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXV0aEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQmFsYW5jZUdldCcsICdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDYW5jZWw6IGFzeW5jIChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNhbmNlbCcsICdiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJDcmVhdGUnLCAnYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRMaXN0JywgJ2JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyRXZlbnRTeW5jJywgJ2JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnLCBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckdldCcsICdiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdDogYXN5bmMgKGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyTGlzdCcsICdiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudCcsICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBHZXQ6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3Q6IGFzeW5jIChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdCcsICdiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgdG8gZ2V0IHJpc2sgaW5zaWdodHMgZm9yIGEgbGlua2VkIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIHJpc2sgb2YgYSBiYW5rIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdH0gYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlOiBhc3luYyAoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlJywgJ2JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0JywgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uRHVwbGljYXRlR2V0OiBhc3luYyAoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25EdXBsaWNhdGVHZXQnLCAnYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCcsIGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9kdXBsaWNhdGUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydENyZWF0ZTogYXN5bmMgKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0Q3JlYXRlJywgJ2JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QnLCBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0R2V0OiBhc3luYyAoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRHZXQnLCAnYmVhY29uUmVwb3J0R2V0UmVxdWVzdCcsIGJlYWNvblJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydExpc3Q6IGFzeW5jIChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydExpc3QnLCAnYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QnLCBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGZvciBhIGdpdmVuIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0OiBhc3luYyAoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldCcsICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QnLCBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0OiBhc3luYyAoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QnLCAnYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCcsIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhbGwgQWNjb3VudHMgbGlua2VkIHRvIHRoaXMgQmVhY29uIFVzZXIuIFRoZSBpbnNpZ2h0cyBmb3IgZWFjaCBhY2NvdW50IGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQ6IGFzeW5jIChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdDogQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQnLCAnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QnLCBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvYWNjb3VudF9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlOiBhc3luYyAoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyQ3JlYXRlJywgJ2JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0JywgYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldDogYXN5bmMgKGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckdldCcsICdiZWFjb25Vc2VyR2V0UmVxdWVzdCcsIGJlYWNvblVzZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0fSBiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckhpc3RvcnlMaXN0OiBhc3luYyAoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VySGlzdG9yeUxpc3QnLCAnYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCcsIGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclJldmlldzogYXN5bmMgKGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlclJldmlldycsICdiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCcsIGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9yZXZpZXdgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0gb3IgYWRkIG5ldyBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIuICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYW4gaWRlbnRpdHkgZGF0YSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdH0gYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyVXBkYXRlOiBhc3luYyAoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyVXBkYXRlJywgJ2JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0JywgYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgY2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhdGVnb3JpZXNHZXQ6IGFzeW5jIChib2R5OiBvYmplY3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY2F0ZWdvcmllc0dldCcsICdib2R5JywgYm9keSlcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY2F0ZWdvcmllcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYm9keSwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zZW50RXZlbnRzR2V0OiBhc3luYyAoY29uc2VudEV2ZW50c0dldFJlcXVlc3Q6IENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjb25zZW50RXZlbnRzR2V0JywgJ2NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0JywgY29uc2VudEV2ZW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NvbnNlbnQvZXZlbnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3VtZXJSZXBvcnRQZGZHZXQ6IGFzeW5jIChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Q6IENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NvbnN1bWVyUmVwb3J0UGRmR2V0JywgJ2NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCcsIGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY29uc3VtZXJfcmVwb3J0L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAgY3JlYXRlcyBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0fSBjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUJhbmtJbmNvbWVDcmVhdGU6IGFzeW5jIChjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdDogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUJhbmtJbmNvbWVDcmVhdGUnLCAnY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QnLCBjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUdldDogYXN5bmMgKGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQmFua0luY29tZUdldCcsICdjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCcsIGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvYmFua19pbmNvbWUvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQmFzZSBSZXBvcnQgZm9yIHlvdXIgdXNlciwgYWxsb3dpbmcgeW91IHRvIHJlY2VpdmUgY29tcHJlaGVuc2l2ZSBiYW5rIGFjY291bnQgYW5kIGNhc2ggZmxvdyBkYXRhLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldCcsICdjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9iYXNlX3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlOiBhc3luYyAoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDaGVja1JlcG9ydENyZWF0ZScsICdjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9uZXR3b3JrX2F0dHJpYnV0ZXNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZXMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGF0dHJpYnV0ZXMgZm9yIHRoZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L25ldHdvcmtfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L3BhcnRuZXJfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlIG1vc3QgcmVjZW50IEJhc2UgUmVwb3J0IChpZiBpdCBleGlzdHMpIGZvciB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkLiBUbyByZXF1ZXN0IHRoYXQgdGhlIG1vc3QgcmVjZW50IEluY29tZSBJbnNpZ2h0cyByZXBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIFBERiBhcyB3ZWxsLCB1c2UgdGhlIGBhZGQtb25zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQ29uc3VtZXIgUmVwb3J0cyBhcyBhIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQZGZHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0UGRmR2V0JywgJ2NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXI6IGFzeW5jIChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXInLCAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1JlZ2lzdGVyOiBhc3luYyAoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1JlZ2lzdGVyJywgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JywgY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVW5yZWdpc3RlcjogYXN5bmMgKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTG9hbnNVbnJlZ2lzdGVyJywgJ2NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlOiBhc3luYyAoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1VwZGF0ZScsICdjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QnLCBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0OiBhc3luYyAoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCcsIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBpdGVtcywgd2hpY2ggYXJlIHVwZGF0ZWQgZXZlcnkgZGF5IChiZXN0LWVmZm9ydCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZTogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlJywgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QnLCBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZTogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0JywgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhUGFydG5lckluc2lnaHRzR2V0JywgJ2NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVHZXQnLCAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVQZGZHZXQnLCAnY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLiBJZiB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGlzIG5vIGxvbmdlciB2YWxpZCAoaS5lLiBkZWxldGVkKSwgdGhlIGVuZHBvaW50IHdpbGwgcmVmcmVzaCB0aGUgbW9zdCByZWNlbnQgdmFsaWQgcmVwb3J0IGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlOiBhc3luYyAoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZScsICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0JywgJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JywgY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0OiBhc3luYyAoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldCcsICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnLCBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVHZXQnLCAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGU6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2s6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjaycsICdjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlOiBhc3luYyAoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUNyZWF0ZScsICdjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5R2V0OiBhc3luYyAoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUdldCcsICdjcmVkaXRSZWxheUdldFJlcXVlc3QnLCBjcmVkaXRSZWxheUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVBkZkdldDogYXN5bmMgKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlQZGZHZXQnLCAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JywgY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVtb3ZlOiBhc3luYyAoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVJlbW92ZScsICdjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QnLCBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcsIGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldDogYXN5bmMgKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0U2Vzc2lvbnNHZXQnLCAnY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0JywgY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0OiBhc3luYyAoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyR2V0JywgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdDogYXN5bmMgKGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGFzaGJvYXJkVXNlckxpc3QnLCAnZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kYXNoYm9hcmRfdXNlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaENyZWF0ZScsICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoR2V0OiBhc3luYyAoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoR2V0JywgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldCcsICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRJZCBSZWNpcGllbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50OiBhc3luYyAocmVjaXBpZW50SWQ6IHN0cmluZywgb0FVVEhTVEFURUlEPzogc3RyaW5nLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlY2lwaWVudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdnZXRSZWNpcGllbnQnLCAncmVjaXBpZW50SWQnLCByZWNpcGllbnRJZClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L3JlY2lwaWVudC97cmVjaXBpZW50SWR9YFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcInJlY2lwaWVudElkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcocmVjaXBpZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChvQVVUSFNUQVRFSUQgIT09IHVuZGVmaW5lZCAmJiBvQVVUSFNUQVRFSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnT0FVVEgtU1RBVEUtSUQnXSA9IFN0cmluZyhvQVVUSFNUQVRFSUQpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50czogYXN5bmMgKG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZHgvcmVjaXBpZW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHRvIHJldHJpZXZlIGlkZW50aXR5IGRldGFpbHMgd2hlbiB1c2luZyBbSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5L2lkZW50aXR5LWRvY3VtZW50LXVwbG9hZC8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0JywgJ2lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldDogYXN5bmMgKGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlHZXQnLCAnaWRlbnRpdHlHZXRSZXF1ZXN0JywgaWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaDogYXN5bmMgKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlNYXRjaCcsICdpZGVudGl0eU1hdGNoUmVxdWVzdCcsIGlkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vYXV0b2ZpbGwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25HZXQnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeScsICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vcmV0cnlgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjaycsICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0OiBhc3luYyAoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXQnLCAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaDogYXN5bmMgKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zU2VhcmNoJywgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzQXV0aEdldCcsICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0OiBhc3luYyAoaXNzdWVzR2V0UmVxdWVzdDogSXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpc3N1ZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpc3N1ZXNHZXQnLCAnaXNzdWVzR2V0UmVxdWVzdCcsIGlzc3Vlc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lzc3Vlcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXNzdWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWFyY2ggZm9yIGFuIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogIGBpdGVtX2lkYCwgYGxpbmtfc2Vzc2lvbl9pZGAgb3IgTGluayBzZXNzaW9uIGByZXF1ZXN0X2lkYC4gIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1NlYXJjaDogYXN5bmMgKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXNzdWVzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXNzdWVzU2VhcmNoJywgJ2lzc3Vlc1NlYXJjaFJlcXVlc3QnLCBpc3N1ZXNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pc3N1ZXMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTdWJzY3JpYmU6IGFzeW5jIChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lzc3Vlc1N1YnNjcmliZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lzc3Vlc1N1YnNjcmliZScsICdpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0JywgaXNzdWVzU3Vic2NyaWJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXNzdWVzL3N1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQ3JlYXRlUHVibGljVG9rZW4nLCAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldDogYXN5bmMgKGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUdldCcsICdpdGVtR2V0UmVxdWVzdCcsIGl0ZW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydDogYXN5bmMgKGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtSW1wb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUltcG9ydCcsICdpdGVtSW1wb3J0UmVxdWVzdCcsIGl0ZW1JbXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2ltcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtSW1wb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZTogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UnLCAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgQ2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyBhIHJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2Ugd2hlbiBvZmZib2FyZGluZyB1c2VycyBvciBpZiBhIHVzZXIgY2hvb3NlcyB0byBkaXNjb25uZWN0IGFuIGFjY291bnQgbGlua2VkIHZpYSBQbGFpZC4gRm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cywgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIExpYWJpbGl0aWVzLCBhbmQgSW52ZXN0bWVudHMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgcmVxdWlyZWQgdG8gZW5kIHN1YnNjcmlwdGlvbiBiaWxsaW5nIGZvciB0aGUgSXRlbS4gRm9yIG1vbmV5IG1vdmVtZW50IHByb2R1Y3RzIHN1Y2ggYXMgQXV0aCBhbmQgVHJhbnNmZXIsIGlmIHRoZSBJdGVtIGlzIGF0IGFuIGluc3RpdHV0aW9uIHRoYXQgdXNlcyBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChUQU5zKSwgc3VjaCBhcyBDaGFzZSBvciBQTkMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgd2lsbCBpbnZhbGlkYXRlIHRoZSBUQU4sIGFuZCBzdWJzZXF1ZW50IEFDSCB0cmFuc2ZlciBhdHRlbXB0cyB1c2luZyB0aGF0IFRBTiB3aWxsIGJlIHJldHVybmVkLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGRvZXMgbm90IGltcGFjdCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBMaW1pdGVkIFByb2R1Y3Rpb24gSXRlbXMgeW91IGhhdmUgYXZhaWxhYmxlLiAgUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIGFjY2VzcyB0byB0aGVtIHNwZWNpZmljYWxseSB1c2luZyB0aGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmU6IGFzeW5jIChpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1SZW1vdmUnLCAnaXRlbVJlbW92ZVJlcXVlc3QnLCBpdGVtUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlOiBhc3luYyAoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtV2ViaG9va1VwZGF0ZScsICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0OiBhc3luYyAobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaWFiaWxpdGllc0dldCcsICdsaWFiaWxpdGllc0dldFJlcXVlc3QnLCBsaWFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaWFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGU6IGFzeW5jIChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUNyZWF0ZScsICdsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0OiBhc3luYyAobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rRGVsaXZlcnlHZXQnLCAnbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCcsIGxpbmtEZWxpdmVyeUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmtfZGVsaXZlcnkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZTogYXN5bmMgKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlJywgJ2xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QnLCBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldDogYXN5bmMgKGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuR2V0JywgJ2xpbmtUb2tlbkdldFJlcXVlc3QnLCBsaW5rVG9rZW5HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBmcm9tIGEgbGlzdCBvZiBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgaW5zaWdodHMgZm9yIHRoZSBwcm92aWRlZCBgYWNjZXNzX3Rva2Vuc2BcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0OiBhc3luYyAobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdDogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCduZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQnLCAnbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCcsIG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL25ldHdvcmtfaW5zaWdodHMvcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldDogYXN5bmMgKG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbmV0d29ya1N0YXR1c0dldCcsICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcsIG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9uZXR3b3JrL3N0YXR1cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckNyZWF0ZScsICdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyUmVtb3ZlOiBhc3luYyAocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUnLCAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlJywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KSwgYW5kIHN0YW5kaW5nIG9yZGVycywgdmFyaWFibGUgcmVjdXJyaW5nIHBheW1lbnRzLCBhbmQgVmlydHVhbCBBY2NvdW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgIHRoZSBsaWtlbGlob29kIG9mIHJlZnVuZCBiZWluZyBzdWNjZXNzZnVsIHdpdGhvdXQgaHVtYW4gaW50ZXJ2ZW50aW9uLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVDcmVhdGU6IGFzeW5jIChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlQ3JlYXRlJywgJ3BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlR2V0OiBhc3luYyAocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUdldCcsICdwYXltZW50UHJvZmlsZUdldFJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZVJlbW92ZTogYXN5bmMgKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVSZW1vdmUnLCAncGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQWNjb3VudEdldDogYXN5bmMgKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQWNjb3VudEdldCcsICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcsIHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcsIHNhdmluZ3MsIG9yIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBdXRoR2V0OiBhc3luYyAocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JBdXRoR2V0JywgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYWxhbmNlR2V0OiBhc3luYyAocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYWxhbmNlR2V0JywgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUnLCAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0OiBhc3luYyAocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJZGVudGl0eUdldCcsICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldDogYXN5bmMgKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcsIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldDogYXN5bmMgKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQnLCAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0JywgJ3Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIFRvIHJldm9rZSBhIGJhbmsgYWNjb3VudCB0b2tlbiwgdGhlIGVudGlyZSB1bmRlcmx5aW5nIGFjY2VzcyB0b2tlbiBtdXN0IGJlIHJldm9rZWQgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gSWYgdXNpbmcgbXVsdGlwbGUgcHJvY2Vzc29ycywgbXVsdGlwbGUgZGlmZmVyZW50IHByb2Nlc3NvciB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIGFjY2VzcyB0b2tlbi4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9maWxlTmV0d29ya1N0YXR1c0dldDogYXN5bmMgKHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQnLCAncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0JywgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBjYXNoZmxvdyB1cGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2hmbG93IFVwZGF0ZXNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlOiBhc3luYyAoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlJywgJ3NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0Jywgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEluY29tZUZpcmVXZWJob29rJywgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gc2FtZSBkYXkgbWljcm8tZGVwb3NpdCBpdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBDaGFzZSBhbmQgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1GaXJlV2ViaG9vaycsICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luOiBhc3luYyAoc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVJlc2V0TG9naW4nLCAnc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1czogYXN5bmMgKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMnLCAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0Jywgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHM6IGFzeW5jIChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzJywgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcsIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9vYXV0aC9zZWxlY3RfYWNjb3VudHNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luJywgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIHZhcmlvdXMgcGF5bWVudCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFRoaXMgZW5kcG9pbnQgd2lsbCB0cmlnZ2VyIHRoZSBjb3JyZXNwb25kaW5nIHBheW1lbnQgc3RhdHVzIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcGF5bWVudCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFBheW1lbnRTaW11bGF0ZScsICdzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQ6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Q6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3QnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW4vYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFVzZXJSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VXNlclJlc2V0TG9naW4nLCAnc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRGVjaXNpb25SZXBvcnQnLCAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZTogYXN5bmMgKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbEV2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRXZhbHVhdGUnLCAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0Jywgc2lnbmFsRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIFNpZ25hbCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBTaWduYWwgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkOiBhc3luYyAoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzRG93bmxvYWQnLCAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcsIHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvZG93bmxvYWRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gaXRlbS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzTGlzdFJlcXVlc3R9IHN0YXRlbWVudHNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNMaXN0OiBhc3luYyAoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzTGlzdCcsICdzdGF0ZW1lbnRzTGlzdFJlcXVlc3QnLCBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNSZWZyZXNoOiBhc3luYyAoc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzdGF0ZW1lbnRzUmVmcmVzaCcsICdzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QnLCBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3N0YXRlbWVudHMvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5oYW5jZTogYXN5bmMgKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zRW5oYW5jZScsICd0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5yaWNoOiBhc3luYyAodHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNFbnJpY2gnLCAndHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCcsIHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0dldCcsICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoZSBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBJdGVtLiBUaGUgSXRlbSBtdXN0IGFscmVhZHkgaGF2ZSBUcmFuc2FjdGlvbnMgYWRkZWQgYXMgYSBwcm9kdWN0IGluIG9yZGVyIHRvIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAuICBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIG9wdGlvbmFsIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jICh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1JlZnJlc2gnLCAndHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlOiBhc3luYyAodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZScsICd0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3Q6IGFzeW5jICh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1J1bGVzTGlzdCcsICd0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgdG8gcmVtb3ZlIGEgdHJhbnNhY3Rpb24gcnVsZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlOiBhc3luYyAodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZScsICd0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jICh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1N5bmMnLCAndHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNhY3Rpb25zL3N5bmNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0JywgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbDogYXN5bmMgKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsJywgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuIFRoZSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIHdpbGwgZXhwaXJlIGlmIG5vdCB1c2VkIGFmdGVyIG9uZSBob3VyLiAoWW91IGNhbiBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhdXRob3JpemF0aW9uIGxpZmV0aW1lLikgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgYWRkaXRpb25hbCB1c2VyIGlucHV0IGlzIG5lZWRlZCwgdXN1YWxseSB0byBmaXggYSBicm9rZW4gYmFuayBjb25uZWN0aW9uLCBiZWZvcmUgUGxhaWQgY2FuIHByb3Blcmx5IGFzc2VzcyB0aGUgcmlzay4gWW91IG5lZWQgdG8gbGF1bmNoIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgdG8gZ2V0IGEgbmV3IExpbmsgdG9rZW4sIGluc3RlYWQgb2YgcHJvdmlkaW5nIGBhY2Nlc3NfdG9rZW5gIGluIHRoZSByZXF1ZXN0LCB5b3Ugc2hvdWxkIHNldCBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGFzIHRoZSBgYXV0aG9yaXphdGlvbi5pZGAuIEFmdGVyIHRoZSBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24uICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuICAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlJywgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIChEZXByZWNhdGVkKSBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0OiBhc3luYyAodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckJhbGFuY2VHZXQnLCAndHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcsIHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNhbmNlbCcsICd0cmFuc2ZlckNhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlckNhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhcGFiaWxpdGllc0dldDogYXN5bmMgKHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQnLCAndHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0JywgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldDogYXN5bmMgKHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDb25maWd1cmF0aW9uR2V0JywgJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QnLCB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IGlzIHJldHJ5YWJsZSBhbmQgaWRlbXBvdGVudDsgaWYgYSB0cmFuc2ZlciB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHRyYW5zZmVyIGRldGFpbHMgd2l0aG91dCBjcmVhdGluZyBhIG5ldyB0cmFuc2Zlci4gQSB0cmFuc2ZlciBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpZiBhIDUwMCBlcnJvciBpcyByZXR1cm5lZDsgdG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8sIHVzZSBbVHJhbnNmZXIgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3JlY29uY2lsaW5nLXRyYW5zZmVycy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDcmVhdGU6IGFzeW5jICh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ3JlYXRlJywgJ3RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZDogYXN5bmMgKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCcsICd0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCcsIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdDogYXN5bmMgKHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQnLCAndHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0JywgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckV2ZW50TGlzdCcsICd0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50U3luYzogYXN5bmMgKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJFdmVudFN5bmMnLCAndHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JywgdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9ldmVudC9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgLiBPbmUgb2YgYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAgbXVzdCBiZSBwb3B1bGF0ZWQgYnV0IG5vdCBib3RoLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckdldDogYXN5bmMgKHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJHZXQnLCAndHJhbnNmZXJHZXRSZXF1ZXN0JywgdHJhbnNmZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRDcmVhdGU6IGFzeW5jICh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVySW50ZW50Q3JlYXRlJywgJ3RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudEdldFJlcXVlc3R9IHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0OiBhc3luYyAodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudEdldCcsICd0cmFuc2ZlckludGVudEdldFJlcXVlc3QnLCB0cmFuc2ZlckludGVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckRlcG9zaXQnLCAndHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZTogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlJywgJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0OiBhc3luYyAodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckxlZGdlckdldCcsICd0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdzogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJXaXRoZHJhdycsICd0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCcsIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0OiBhc3luYyAodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlckxpc3QnLCAndHJhbnNmZXJMaXN0UmVxdWVzdCcsIHRyYW5zZmVyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0OiBhc3luYyAodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1ldHJpY3NHZXQnLCAndHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCcsIHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuIFRoaXMgZW5kcG9pbnQgaXMgYWxzbyByZXF1aXJlZCB3aGVuIGFkZGluZyBhbiBJdGVtIGZvciB1c2Ugd2l0aCB3aXJlIHRyYW5zZmVyczsgaWYgeW91IGludGVuZCB0byBjcmVhdGUgd2lyZSB0cmFuc2ZlcnMgb24gdGhpcyBhY2NvdW50LCB5b3UgbXVzdCBwcm92aWRlIGB3aXJlX3JvdXRpbmdfbnVtYmVyYC4gTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWlncmF0ZUFjY291bnQ6IGFzeW5jICh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTWlncmF0ZUFjY291bnQnLCAndHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnLCB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGU6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGU6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlJywgJ3RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yR2V0OiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JHZXQnLCAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yTGlzdDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yTGlzdCcsICd0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IGFsbG93cyBnYXRoZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3Igc3BlY2lmaWMgdG8gdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZywgaW5jbHVkaW5nIHRoZSBvcmlnaW5hdG9yXFwncyBhZ3JlZW1lbnQgdG8gbGVnYWwgdGVybXMgcmVxdWlyZWQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gb3JpZ2luYXRvciBmb3Igc2NhbGVkIHBsYXRmb3JtIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlJywgJ3RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwZXJzb24gcmVjb3JkIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb24tc3BlY2lmaWMgcmVxdWlyZW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlJywgJ3RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCBhbGxvd3MgcGxhdGZvcm1zIHRvIHN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgYW4gb3JpZ2luYXRvciBhcyBwYXJ0IG9mIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgU2NhbGVkIFBsYXRmb3JtIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdDogYXN5bmMgKHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0JywgJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QnLCB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUnLCAndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci4gIFNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIGJhbmsgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsOiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCcsICd0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUnLCAndHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0dldDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdHZXQnLCAndHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdMaXN0OiBhc3luYyAodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlY3VycmluZ0xpc3QnLCAndHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENhbmNlbDogYXN5bmMgKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWZ1bmRDYW5jZWwnLCAndHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlJywgJ3RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRHZXQ6IGFzeW5jICh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kR2V0JywgJ3RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdHMgaGlzdG9yaWNhbCByZXBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRMaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0OiBhc3luYyAodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QnLCAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcsIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0OiBhc3luYyAodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwR2V0JywgJ3RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0OiBhc3luYyAodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclN3ZWVwTGlzdCcsICd0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uR2V0OiBhc3luYyAodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyQWNjb3VudFNlc3Npb25HZXQnLCAndXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCcsIHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIENoZWNrIG9yIEluY29tZSBmbG93LCBvciBhIE11bHRpLUl0ZW0gTGluayBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBUaGUgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQ3JlYXRlOiBhc3luYyAodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyQ3JlYXRlJywgJ3VzZXJDcmVhdGVSZXF1ZXN0JywgdXNlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0dldDogYXN5bmMgKHVzZXJJdGVtc0dldFJlcXVlc3Q6IFVzZXJJdGVtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckl0ZW1zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckl0ZW1zR2V0JywgJ3VzZXJJdGVtc0dldFJlcXVlc3QnLCB1c2VySXRlbXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2l0ZW1zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSB1c2VyIHRva2VuIGFuZCBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFueSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuLiAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB1c2VyIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJSZW1vdmVSZXF1ZXN0fSB1c2VyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJSZW1vdmU6IGFzeW5jICh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJSZW1vdmUnLCAndXNlclJlbW92ZVJlcXVlc3QnLCB1c2VyUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB1c2VkIGJ5IGEgc3BlY2lmaWVkIHRoaXJkLXBhcnR5IGNsaWVudCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhyb3VnaCBzdXBwb3J0ZWQgZW5kcG9pbnRzLiAgRW5zdXJlIHlvdSBzdG9yZSB0aGUgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gIGFsb25nIHdpdGggdGhlIGB1c2VyX3Rva2VuYCBhbmQgYHRoaXJkX3BhcnR5X2NsaWVudF9pZGAsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlOiBhc3luYyAodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlJywgJ3VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0JywgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBkZWxldGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBPbmNlIHJlbW92ZWQsIHRoZSB0b2tlbiBjYW4gbG9uZ2VyIGJlIHVzZWQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiAgIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmU6IGFzeW5jICh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUnLCAndXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QnLCB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5hYmxlIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYCBmb3IgdXNlIHdpdGggQ29uc3VtZXIgUmVwb3J0cyBieSBQbGFpZCBDaGVjaywgYnkgYWRkaW5nIGEgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgdG8gdGhlIHVzZXIuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGU6IGFzeW5jICh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJVcGRhdGUnLCAndXNlclVwZGF0ZVJlcXVlc3QnLCB1c2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlclVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0Q3JlYXRlOiBhc3luYyAod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRDcmVhdGUnLCAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcsIHdhbGxldENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldEdldDogYXN5bmMgKHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0R2V0JywgJ3dhbGxldEdldFJlcXVlc3QnLCB3YWxsZXRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0OiBhc3luYyAod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRMaXN0JywgJ3dhbGxldExpc3RSZXF1ZXN0Jywgd2FsbGV0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGU6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZScsICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2V4ZWN1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkdldDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25HZXQnLCAnd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uTGlzdDogYXN5bmMgKHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0VHJhbnNhY3Rpb25MaXN0JywgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnLCB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Byb2dyYW0vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXN0b3J5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2hpdC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQ6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Byb2dyYW0vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcmV2aWV3L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldDogYXN5bmMgKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCcsICd3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCcsIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRnAgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IgPSBQbGFpZEFwaUF4aW9zUGFyYW1DcmVhdG9yKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gVG8gcmV0dXJuIG5ldyBhY2NvdW50cyB0aGF0IHdlcmUgY3JlYXRlZCBhZnRlciB0aGUgdXNlciBsaW5rZWQgdGhlaXIgSXRlbSwgeW91IGNhbiBsaXN0ZW4gZm9yIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBQbGFpZCBjbGllbnRzIGZvciB0aGUgcHVycG9zZSBvZiBidWlsZGluZyBjb250cm9sLXRvd2VyIGV4cGVyaWVuY2VzXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFwcGxpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQsIHRoZSBBc3NldCBSZXBvcnQgaXRzZWxmIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhbiBgYWNjZXNzX3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBjcmVhdGUgbmV3IEFzc2V0IFJlcG9ydHMgd2l0aCBpdC4gUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIHRoZW0gc3BlY2lmaWNhbGx5LiAgVGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydC4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGludmFsaWRhdGVzIGl0cyBgYXNzZXRfcmVwb3J0X3Rva2VuYCwgbWVhbmluZyB5b3Ugd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhIG9yIGNyZWF0ZSBuZXcgQXVkaXQgQ29waWVzLiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgZG9lcyBub3QgYWZmZWN0IHRoZSB1bmRlcmx5aW5nIEl0ZW1zLCBidXQgZG9lcyBpbnZhbGlkYXRlIGFueSBgYXVkaXRfY29weV90b2tlbnNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdDogQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgUGxhaWQtaW5pdGlhdGVkIEFDSCBvciBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIEJhbmsgVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgIHRvIGdldCByaXNrIGluc2lnaHRzIGZvciBhIGxpbmtlZCBhY2NvdW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3R9IGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdDogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIGZyYXVkIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRHZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhbGwgQWNjb3VudHMgbGlua2VkIHRvIHRoaXMgQmVhY29uIFVzZXIuIFRoZSBpbnNpZ2h0cyBmb3IgZWFjaCBhY2NvdW50IGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIEJlYWNvbiBVc2VyIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIEJlYWNvbiBVc2VyXFwncyBoaXN0b3J5XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtIG9yIGFkZCBuZXcgYWNjb3VudHMgdG8gdGhlIEJlYWNvbiBVc2VyLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGFuIGlkZW50aXR5IGRhdGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBvZiBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgY2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENhdGVnb3JpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDb25zZW50RXZlbnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyBhbGwgZXhpc3RpbmcgQ1JCIEJhbmsgSW5jb21lIGFuZCBCYXNlIHJlcG9ydHMgZm9yIHRoZSBjb25zdW1lciBpbiBQREYgZm9ybWF0LiAgUmVzcG9uc2UgaXMgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBSZXBvcnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Q6IENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYCBjcmVhdGVzIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3R9IGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQmFua0luY29tZUNyZWF0ZShjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdDogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEJhc2UgUmVwb3J0IGZvciB5b3VyIHVzZXIsIGFsbG93aW5nIHlvdSB0byByZWNlaXZlIGNvbXByZWhlbnNpdmUgYmFuayBhY2NvdW50IGFuZCBjYXNoIGZsb3cgZGF0YS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgQmFzZSBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluZm9ybWF0aW9uIGZyb20geW91ciB1c2VyXFwncyBiYW5rc1xuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9uZXR3b3JrX2F0dHJpYnV0ZXNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZXMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGF0dHJpYnV0ZXMgZm9yIHRoZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgY2FsbCBvdXIgcGFydG5lcnMgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgIHJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnQgQ29uc3VtZXIgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJ5IGRlZmF1bHQsIHRoZSBtb3N0IHJlY2VudCBCYXNlIFJlcG9ydCAoaWYgaXQgZXhpc3RzKSBmb3IgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZC4gVG8gcmVxdWVzdCB0aGF0IHRoZSBtb3N0IHJlY2VudCBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGJlIGluY2x1ZGVkIGluIHRoZSBQREYgYXMgd2VsbCwgdXNlIHRoZSBgYWRkLW9uc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIENvbnN1bWVyIFJlcG9ydHMgYXMgYSBQREZcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHMuXG4gICAgICAgICAqIEBwYXJhbSB7Q1JBTG9hbnNSZWdpc3RlclJlcXVlc3R9IGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNSZWdpc3RlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91cGRhdGVgIHVwZGF0ZXMgbG9hbiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzdGF0dXMgYW5kIHBheW1lbnQgaGlzdG9yeS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlcyBsb2FuIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVcGRhdGVSZXF1ZXN0fSBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3Q6IENyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgaXRlbXMsIHdoaWNoIGFyZSB1cGRhdGVkIGV2ZXJ5IGRheSAoYmVzdC1lZmZvcnQpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byB1bnN1YnNjcmliZSBmcm9tIHByZXZpb3VzbHkgc3Vic2NyaWJlZCBNb25pdG9yaW5nIEluc2lnaHRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbnN1YnNjcmliZSBmcm9tIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlYXRlUGF5bWVudFRva2VuKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLiBJZiB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGlzIG5vIGxvbmdlciB2YWxpZCAoaS5lLiBkZWxldGVkKSwgdGhlIGVuZHBvaW50IHdpbGwgcmVmcmVzaCB0aGUgbW9zdCByZWNlbnQgdmFsaWQgcmVwb3J0IGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGAgcmV0dXJucyBwYXJzZWQgZGF0YSBmcm9tIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBieSB1c2VycyBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdy4gSWYgeW91ciBhY2NvdW50IGlzIG5vdCBlbmFibGVkIGZvciBEb2N1bWVudCBQYXJzaW5nLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyBhIGdpdmVuIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gYXNzZXNzIGEgdXNlci11cGxvYWRlZCBkb2N1bWVudCBmb3Igc2lnbnMgb2YgcG90ZW50aWFsIGZyYXVkIG9yIHRhbXBlcmluZy4gSXQgcmV0dXJucyBhIHJpc2sgc2NvcmUgZm9yIGVhY2ggdXBsb2FkZWQgZG9jdW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGRvY3VtZW50IGJlaW5nIGZyYXVkdWxlbnQsIGluIGFkZGl0aW9uIHRvIGRldGFpbHMgb24gdGhlIGluZGl2aWR1YWwgcmlzayBzaWduYWxzIGNvbnRyaWJ1dGluZyB0byB0aGUgc2NvcmUuICBUbyB0cmlnZ2VyIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gZm9yIGFuIEl0ZW0sIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBgcGFyc2luZ19jb25maWdgIHNldCB0byBpbmNsdWRlIGByaXNrX3NpZ25hbHNgLCBvciBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAuIE9uY2UgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGBJTkNPTUVfVkVSSUZJQ0FUSU9OX1JJU0tfU0lHTkFMU2Agd2ViaG9vayBoYXMgYmVlbiBmaXJlZC4gIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIERvY3VtZW50IEluY29tZSBhbmQgaXMgYmlsbGVkIHNlcGFyYXRlbHkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIHByb2R1Y3QgYWNjZXNzIHJlcXVlc3Qgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVBERkdldFJlcXVlc3R9IGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0fSBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Q6IENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhIHNwZWNpZmljIERhc2hib2FyZCB1c2VyIGJhc2VkIG9uIHRoZSBgZGFzaGJvYXJkX3VzZXJfaWRgIGZpZWxkLCB3aGljaCBpcyByZXR1cm5lZCBpbiB0aGUgYGF1ZGl0X3RyYWlsYCBvYmplY3Qgb2YgY2VydGFpbiBNb25pdG9yIGFuZCBCZWFjb24gZW5kcG9pbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyByZXZpZXdlciB3aG8gcGVyZm9ybWVkIGEgRGFzaGJvYXJkIGFjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvZGFzaGJvYXJkX3VzZXIvbGlzdGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhbGwgRGFzaGJvYXJkIHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuIFRoaXMgY2FuIHVzZSB1c2VkIHRvIGF1ZGl0IG9yIHRyYWNrIHRoZSBsaXN0IG9mIHJldmlld2VycyBmb3IgTW9uaXRvciwgQmVhY29uLCBhbmQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2R1Y3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGRhc2hib2FyZCB1c2Vyc1xuICAgICAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5kZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0OiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8dm9pZD4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5mZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRJZCBSZWNpcGllbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkOiBzdHJpbmcsIG9BVVRIU1RBVEVJRD86IHN0cmluZywgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxHZXRSZWNpcGllbnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5nZXRSZWNpcGllbnQocmVjaXBpZW50SWQsIG9BVVRIU1RBVEVJRCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIFJlY2lwaWVudHNcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFJlY2lwaWVudHMob3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxHZXRSZWNpcGllbnRzUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZ2V0UmVjaXBpZW50cyhvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdDogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eU1hdGNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlSZWZyZXNoUmVxdWVzdH0gaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvZiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGF1dG9maWxsIGZvciBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIERvd25sb2FkIHRoZSBvcmlnaW5hbCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvbuKAmXMgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnTigJlzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudCBob2xkaW5ncyBhbmQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW2BJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYW5kIGhvbGRpbmdzIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIE5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGludmVzdG1lbnQgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdDogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXNzdWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWFyY2ggZm9yIGFuIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogIGBpdGVtX2lkYCwgYGxpbmtfc2Vzc2lvbl9pZGAgb3IgTGluayBzZXNzaW9uIGByZXF1ZXN0X2lkYC4gIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0OiBJc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElzc3Vlc1NlYXJjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdDogSXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY3Rpdml0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHB1YmxpYyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUltcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0uIEZvciBtb25leSBtb3ZlbWVudCBwcm9kdWN0cyBzdWNoIGFzIEF1dGggYW5kIFRyYW5zZmVyLCBpZiB0aGUgSXRlbSBpcyBhdCBhbiBpbnN0aXR1dGlvbiB0aGF0IHVzZXMgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoVEFOcyksIHN1Y2ggYXMgQ2hhc2Ugb3IgUE5DLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIHdpbGwgaW52YWxpZGF0ZSB0aGUgVEFOLCBhbmQgc3Vic2VxdWVudCBBQ0ggdHJhbnNmZXIgYXR0ZW1wdHMgdXNpbmcgdGhhdCBUQU4gd2lsbCBiZSByZXR1cm5lZC4gIEluIExpbWl0ZWQgUHJvZHVjdGlvbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgTGltaXRlZCBQcm9kdWN0aW9uIEl0ZW1zIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBQT1NUIGAvaXRlbS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBbYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyN3ZWJob29rX3VwZGF0ZV9hY2tub3dsZWRnZWQpIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUdldFJlcXVlc3R9IGxpbmtEZWxpdmVyeUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgdGhlIExpbmsgQ29ycmVsYXRpb24gSWQgZm9yIGEgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYC4gRm9yIG1vc3QgUGxhaWQgcHJvZHVjdHMsIHRoZSBgcHVibGljX3Rva2VuYCBpcyBzYXZlZCBhbmQgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0OiBMaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPExpbmtUb2tlbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIGZyb20gYSBsaXN0IG9mIGBhY2Nlc3NfdG9rZW5zYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBpbnNpZ2h0cyBmb3IgdGhlIHByb3ZpZGVkIGBhY2Nlc3NfdG9rZW5zYFxuICAgICAgICAgKiBAcGFyYW0ge05ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3R9IG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdDogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5uZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLm5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy4gVG8gY3JlYXRlIGVuZCBjdXN0b21lcnMsIGl0IHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb25seSwgZXZlbiB3aGVuIGNyZWF0aW5nIFNhbmRib3ggQVBJIGtleXMuIElmIGNhbGxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgaXQgd2lsbCByZXR1cm4gYSBzYW1wbGUgcmVzcG9uc2UsIGJ1dCBubyBjdXN0b21lciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBBUEkga2V5cyB3aWxsIG5vdCBiZSB2YWxpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBlbmQgY3VzdG9tZXIgZm9yIGEgUGxhaWQgcmVzZWxsZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gZW5hYmxlIGFuIGVuZCBjdXN0b21lciBpbiB0aGUgZnVsbCBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBmdWxsIFByb2R1Y3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNyZWF0aW5nIGEgcGF5bWVudCByZWNpcGllbnQsIHlvdSBjYW4gdXNlIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGF5bWVudCB0byB0aGF0IHJlY2lwaWVudC4gIFBheW1lbnRzIGNhbiBiZSBvbmUtdGltZSBvciBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBhbmQgY2FuIGJlIGRlbm9taW5hdGVkIGluIGVpdGhlciBFVVIsIEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSkuICBJZiBtYWtpbmcgZG9tZXN0aWMgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzLCB5b3VyIHJlY2lwaWVudCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggQkFDUyBudW1iZXJzLiBJbiBnZW5lcmFsLCBFVVItZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciwgR0JQLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgdGhlIEZhc3RlciBQYXltZW50cyBuZXR3b3JrIGFuZCBmb3Igbm9uLUV1cm96b25lIG1hcmtldHMgdHlwaWNhbGx5IHZpYSB0aGUgbG9jYWwgcGF5bWVudCBzY2hlbWUsIGJ1dCB0aGUgcGF5bWVudCBuZXR3b3JrIHVzZWQgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gUGF5bWVudHMgc2VudCB2aWEgRmFzdGVyIFBheW1lbnRzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbW1lZGlhdGVseSwgd2hpbGUgcGF5bWVudHMgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIgb3Igb3RoZXIgbG9jYWwgcGF5bWVudCBzY2hlbWVzIHdpbGwgdHlwaWNhbGx5IGFycml2ZSBpbiBvbmUgYnVzaW5lc3MgZGF5LiAgU3RhbmRpbmcgb3JkZXJzIChyZWN1cnJpbmcgcGF5bWVudHMpIG11c3QgYmUgZGVub21pbmF0ZWQgaW4gR0JQIGFuZCBjYW4gb25seSBiZSBzZW50IHRvIHJlY2lwaWVudHMgaW4gdGhlIFVLLiBPbmNlIGNyZWF0ZWQsIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGNhbm5vdCBiZSBtb2RpZmllZCBvciBjYW5jZWxlZCB2aWEgdGhlIEFQSS4gQW4gZW5kIHVzZXIgY2FuIGNhbmNlbCBvciBtb2RpZnkgYSBzdGFuZGluZyBvcmRlciBkaXJlY3RseSBvbiB0aGVpciBiYW5raW5nIGFwcGxpY2F0aW9uIG9yIHdlYnNpdGUsIG9yIGJ5IGNvbnRhY3RpbmcgdGhlIGJhbmsuIFN0YW5kaW5nIG9yZGVycyB3aWxsIGZvbGxvdyB0aGUgcGF5bWVudCBydWxlcyBvZiB0aGUgdW5kZXJseWluZyByYWlscyAoRmFzdGVyIFBheW1lbnRzIGluIFVLKS4gUGF5bWVudHMgY2FuIGJlIHNlbnQgTW9uZGF5IHRvIEZyaWRheSwgZXhjbHVkaW5nIGJhbmsgaG9saWRheXMuIElmIHRoZSBwcmUtYXJyYW5nZWQgZGF0ZSBmYWxscyBvbiBhIHdlZWtlbmQgb3IgYmFuayBob2xpZGF5LCB0aGUgcGF5bWVudCBpcyBtYWRlIG9uIHRoZSBuZXh0IHdvcmtpbmcgZGF5LiBJdCBpcyBub3QgcG9zc2libGUgdG8gZ3VhcmFudGVlIHRoZSBleGFjdCB0aW1lIHRoZSBwYXltZW50IHdpbGwgcmVhY2ggdGhlIHJlY2lwaWVudOKAmXMgYWNjb3VudCwgYWx0aG91Z2ggYXQgbGVhc3QgOTAlIG9mIHN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIGFyZSBzZW50IGJ5IDZhbS4gIEluIExpbWl0ZWQgUHJvZHVjdGlvbiwgcGF5bWVudHMgbXVzdCBiZSBiZWxvdyA1IEdCUCBvciBvdGhlciBjaG9zZW4gW2N1cnJlbmN5XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbi1wYXltZW50LWNyZWF0ZS1yZXF1ZXN0LWFtb3VudC1jdXJyZW5jeSksIGFuZCBzdGFuZGluZyBvcmRlcnMsIHZhcmlhYmxlIHJlY3VycmluZyBwYXltZW50cywgYW5kIFZpcnR1YWwgQWNjb3VudHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiAgUHJvdmlkaW5nIGNvdW50ZXJwYXJ0eSBpbmZvcm1hdGlvbiBzdWNoIGFzIGRhdGUgb2YgYmlydGggYW5kIGFkZHJlc3MgaW5jcmVhc2VzICB0aGUgbGlrZWxpaG9vZCBvZiByZWZ1bmQgYmVpbmcgc3VjY2Vzc2Z1bCB3aXRob3V0IGh1bWFuIGludGVydmVudGlvbi4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcGF5bWVudCByZWNpcGllbnQgZm9yIHBheW1lbnQgaW5pdGlhdGlvbi4gIFRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiBFdXJvcGUsIHdpdGhpbiBhIGNvdW50cnkgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGUgU2luZ2xlIEV1cm8gUGF5bWVudCBBcmVhIChTRVBBKSBvciBhIG5vbi1FdXJvem9uZSBjb3VudHJ5IFtzdXBwb3J0ZWRdKGh0dHBzOi8vcGxhaWQuY29tL2dsb2JhbCkgYnkgUGxhaWQuIEZvciBhIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIHBheW1lbnQsIHRoZSByZWNpcGllbnQgbXVzdCBiZSBpbiB0aGUgVUsuICBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGJhY3NgIGluIHRoZSBVSyBhbmQgYGliYW5gIGluIEVVLiAgVGhlIGVuZHBvaW50IGlzIGlkZW1wb3RlbnQ6IGlmIGEgZGV2ZWxvcGVyIGhhcyBhbHJlYWR5IG1hZGUgYSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgcGF5bWVudCBkZXRhaWxzLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgc2FtZSBgcmVjaXBpZW50X2lkYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvbGlzdGAgZW5kcG9pbnQgbGlzdCB0aGUgcGF5bWVudCByZWNpcGllbnRzIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdH0gcHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcsIHNhdmluZ3MsIG9yIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBCYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgbWF0Y2ggc2NvcmVcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciB0aGUgaW52ZXN0bWVudCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzc29yIHRva2VuLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBjb3VudCBhbmQgb2Zmc2V0IHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMuICBOb3RlIHRoYXQgSW52ZXN0bWVudHMgZG9lcyBub3QgaGF2ZSBhIHdlYmhvb2sgdG8gaW5kaWNhdGUgd2hlbiBpbml0aWFsIHRyYW5zYWN0aW9uIGRhdGEgaGFzIGxvYWRlZCAodW5sZXNzIHlvdSB1c2UgdGhlIGBhc3luY191cGRhdGVgIG9wdGlvbikuIEluc3RlYWQsIGlmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBUbyBiZSBhbGVydGVkIHdoZW4gdGhlIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rLiBJZiBubyBpbnZlc3RtZW50cyBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIEludmVzdG1lbnRzIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGEgbG9hbiBvciBjcmVkaXQgYWNjb3VudC4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci9saWFiaWxpdGllcy9nZXRgLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBgbGlhYmlsaXRpZXNgIHdhcyBub3Qgc3BlY2lmaWVkIGFzIGFuIGluaXRpYWwgcHJvZHVjdCB3aGVuIGNyZWF0aW5nIHRoZSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHRvIHJldHJpZXZlIHRoZSBhZGRpdGlvbmFsIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gYXMgYSBwcm9jZXNzb3IgdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gb3VyIGVycm9yIGRvY3VtZW50YXRpb24gb24gW2l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS4gVG8gcmVkdWNlIHRoaXMgbGF0ZW5jeSwgeW91IGNhbiBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIG9uIHRoZSBJdGVtIGJlZm9yZSB5b3UgbmVlZCB0byByZXF1ZXN0IFNpZ25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYSBwcm9jZXNzb3IgdG9rZW4gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBwcm9jZXNzb3IgdG9rZW4gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2Vzcywgd2hpY2ggd2lsbCBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgdGhpcyBlbmRwb2ludCBpcyBjYWxsZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGl0IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIHByb2Nlc3NvciB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gU3RyaXBlIHRvIGVuYWJsZSBQbGFpZC1TdHJpcGUgaW50ZWdyYXRpb25zLiBGb3IgYSBkZXRhaWxlZCBndWlkZSBvbiBpbnRlZ3JhdGluZyBTdHJpcGUsIHNlZSBbQWRkIFN0cmlwZSB0byB5b3VyIGFwcF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL3BhcnRuZXJzaGlwcy9zdHJpcGUvKS4gIE5vdGUgdGhhdCB0aGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlbiBpcyBhIG9uZS10aW1lIHVzZSB0b2tlbi4gVG8gc3RvcmUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGZvciBsYXRlciB1c2UsIHlvdSBjYW4gdXNlIGEgU3RyaXBlIGN1c3RvbWVyIG9iamVjdCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLCBvciB5b3UgY2FuIHVzZSBhIFN0cmlwZSBDdXN0b20gYWNjb3VudCBhbmQgY3JlYXRlIGFuIGFzc29jaWF0ZWQgZXh0ZXJuYWwgYmFuayBhY2NvdW50IGZyb20gdGhlIHRva2VuLiBUaGlzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBzaG91bGQgd29yayBpbmRlZmluaXRlbHksIHVubGVzcyB0aGUgdXNlclxcJ3MgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNoYW5nZXMgb3IgdGhleSByZXZva2UgUGxhaWRcXCdzIHBlcm1pc3Npb25zIHRvIGFjY2VzcyB0aGVpciBhY2NvdW50LiBTdHJpcGUgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIHRoZSBiYW5rIGFjY291bnQgdG9rZW4gaGFzIGJlZW4gY3JlYXRlZC4gSWYgeW91IGV2ZXIgbmVlZCB0byBjaGFuZ2UgdGhlIGJhbmsgYWNjb3VudCBkZXRhaWxzIHVzZWQgYnkgU3RyaXBlIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyLCBoYXZlIHRoZSB1c2VyIGdvIHRocm91Z2ggTGluayBhZ2FpbiBhbmQgY3JlYXRlIGEgbmV3IGJhbmsgYWNjb3VudCB0b2tlbiBmcm9tIHRoZSBuZXcgYGFjY2Vzc190b2tlbmAuICBUbyByZXZva2UgYSBiYW5rIGFjY291bnQgdG9rZW4sIHRoZSBlbnRpcmUgdW5kZXJseWluZyBhY2Nlc3MgdG9rZW4gbXVzdCBiZSByZXZva2VkIHVzaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gSWYgdXNpbmcgbXVsdGlwbGUgcHJvY2Vzc29ycywgbXVsdGlwbGUgZGlmZmVyZW50IHByb2Nlc3NvciB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIGFjY2VzcyB0b2tlbi4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UsIHRoZSBwcm9jZXNzb3IsIHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIHJlcXVlc3QgdHJpZ2dlcnMgYSBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYCB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgcHJvY2Vzc29yIHRva2VuLiBJZiBjaGFuZ2VzIHRvIHRyYW5zYWN0aW9ucyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIFtgVFJBTlNBQ1RJT05TX1JFTU9WRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19yZW1vdmVkKSB3aWxsIGJlIGZpcmVkIGlmIGFueSByZW1vdmVkIHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNkZWZhdWx0X3VwZGF0ZSkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgbmV3IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIE5ldyB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AuIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0KHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBiYW5rIGluY29tZSB3ZWJob29rIGluIHNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIGNhc2hmbG93IHVwZGF0ZXMgKE1vbml0b3JpbmcpIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIGFuIHVwZGF0ZSBmb3IgQ2FzaGZsb3cgVXBkYXRlc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0fSBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gc2FtZSBkYXkgbWljcm8tZGVwb3NpdCBpdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBDaGFzZSBhbmQgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTx7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGEgUGF5bWVudCBQcm9maWxlIGludG8gYSBzdGF0ZSB3aGVyZSB0aGUgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmAsIGNhbGxzIHRvIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgd2lsbCByZXN1bHQgaW4gYSBgZGVjaXNpb25fcmF0aW9uYWxlYCBgUEFZTUVOVF9QUk9GSUxFX0xPR0lOX1JFUVVJUkVEYC4gWW91IGNhbiB0aGVuIHVzZSB1cGRhdGUgbW9kZSBmb3IgUGF5bWVudCBQcm9maWxlIHRvIHJlc3RvcmUgaXQgaW50byBhIGdvb2Qgc3RhdGUuICAgSW4gb3JkZXIgdG8gaW52b2tlIHRoaXMgZW5kcG9pbnQsIHlvdSBtdXN0IGZpcnN0IFtjcmVhdGUgYSBQYXltZW50IFByb2ZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtcGF5bWVudC1wcm9maWxlLW9wdGlvbmFsKSBhbmQgW2dvIHRocm91Z2ggdGhlIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1saW5rLXRva2VuKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVwYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudC4gQXMgYSBzaWRlIGVmZmVjdCBvZiBjYWxsaW5nIHRoaXMgcm91dGUsIGEgcmVwYXltZW50IGlzIGNyZWF0ZWQgdGhhdCBpbmNsdWRlcyBhbGwgdW5yZWltYnVyc2VkIHJldHVybnMgb2YgZ3VhcmFudGVlZCB0cmFuc2ZlcnMuIElmIHRoZXJlIGFyZSBubyBzdWNoIHJldHVybnMsIGFuIDQwMCBlcnJvciBpcyByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHN3ZWVwIGFuZCBhc3NvY2lhdGVkIGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVXBvbiBjYWxsaW5nIHRoaXMgZW5kcG9pbnQsIGFsbCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdF9zZXR0bGVkYCwgYWxsIGBwb3N0ZWRgIG9yIGBwZW5kaW5nYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgdW5zd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0YCwgYW5kIGFsbCBgcmV0dXJuZWRgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHJldHVybl9zd2VwdGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAgICAgKiBAc3VtbWFyeSBBZHZhbmNlIGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRlc3QgY2xvY2tzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBieSBhc2NlbmRpbmcgYHZpcnR1YWxfdGltZWAuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRlc3QgY2xvY2tzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgaXRlbShzKSBmb3IgYSBTYW5kYm94IFVzZXIgaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtJdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbEV2YWx1YXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb24gSXRlbXMgd2hlcmUgU2lnbmFsIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFNpZ25hbCB3aWxsIGhhdmUgYWNjZXNzIHRvIGxlc3MgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBTaWduYWwgc2NvcmUuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gaXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy92MS9lbmhhbmNlYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBwcm92aWRlZCBkaXJlY3RseSBieSBjbGllbnRzLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhlIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIFRyYW5zYWN0aW9ucyBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYC4gIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gb3B0aW9uYWwgYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuIFRoZSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIHdpbGwgZXhwaXJlIGlmIG5vdCB1c2VkIGFmdGVyIG9uZSBob3VyLiAoWW91IGNhbiBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhdXRob3JpemF0aW9uIGxpZmV0aW1lLikgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgYWRkaXRpb25hbCB1c2VyIGlucHV0IGlzIG5lZWRlZCwgdXN1YWxseSB0byBmaXggYSBicm9rZW4gYmFuayBjb25uZWN0aW9uLCBiZWZvcmUgUGxhaWQgY2FuIHByb3Blcmx5IGFzc2VzcyB0aGUgcmlzay4gWW91IG5lZWQgdG8gbGF1bmNoIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgdG8gZ2V0IGEgbmV3IExpbmsgdG9rZW4sIGluc3RlYWQgb2YgcHJvdmlkaW5nIGBhY2Nlc3NfdG9rZW5gIGluIHRoZSByZXF1ZXN0LCB5b3Ugc2hvdWxkIHNldCBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGFzIHRoZSBgYXV0aG9yaXphdGlvbi5pZGAuIEFmdGVyIHRoZSBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24uICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuICAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogKERlcHJlY2F0ZWQpIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgaXMgcmV0cnlhYmxlIGFuZCBpZGVtcG90ZW50OyBpZiBhIHRyYW5zZmVyIHdpdGggdGhlIHByb3ZpZGVkIGB0cmFuc2Zlcl9pZGAgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBpdCB3aWxsIHJldHVybiB0aGUgdHJhbnNmZXIgZGV0YWlscyB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IHRyYW5zZmVyLiBBIHRyYW5zZmVyIG1heSBzdGlsbCBiZSBjcmVhdGVkIGlmIGEgNTAwIGVycm9yIGlzIHJldHVybmVkOyB0byBkZXRlY3QgdGhpcyBzY2VuYXJpbywgdXNlIFtUcmFuc2ZlciBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvcmVjb25jaWxpbmctdHJhbnNmZXJzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgLiBPbmUgb2YgYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAgbXVzdCBiZSBwb3B1bGF0ZWQgYnV0IG5vdCBib3RoLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlcG9zaXQgZnVuZHMgaW50byBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gVHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCBhbGxvd3MgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHNwZWNpZmljIHRvIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIGxlZ2FsIHRlcm1zIHJlcXVpcmVkIGJlZm9yZSBhY2NlcHRpbmcgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIG9yaWdpbmF0b3IgZm9yIHNjYWxlZCBwbGF0Zm9ybSBjdXN0b21lcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBlcnNvbiByZWNvcmQgYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3IgYW5kIG9wdGlvbmFsbHkgc3VibWl0IHBlcnNvbi1zcGVjaWZpYyByZXF1aXJlbWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCBhbGxvd3MgcGxhdGZvcm1zIHRvIHN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgYW4gb3JpZ2luYXRvciBhcyBwYXJ0IG9mIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgU2NhbGVkIFBsYXRmb3JtIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci4gIFNjaGVkdWxlZCB0cmFuc2ZlciB0aGF0IGhhc25cXCd0IGJlZW4gc3VibWl0dGVkIHRvIGJhbmsgd2lsbCBiZSBjYW5jZWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgcmVjdXJyaW5nIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHJlY3VycmluZyB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGEgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBDaGVjayBvciBJbmNvbWUgZmxvdywgb3IgYSBNdWx0aS1JdGVtIExpbmsgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgVGhlIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IG11c3QgYmUgcHJlc2VudCBpbiBvcmRlciB0byBjcmVhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQgZm9yIGEgdXNlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkIGR1cmluZyB0aGUgYC91c2VyL2NyZWF0ZWAgY2FsbCwgaXQgY2FuIGJlIGFkZGVkIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXIgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VySXRlbXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSB1c2VyIHRva2VuIGFuZCBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFueSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuLiAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB1c2VyIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJSZW1vdmVSZXF1ZXN0fSB1c2VyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyUmVtb3ZlKHVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB1c2VkIGJ5IGEgc3BlY2lmaWVkIHRoaXJkLXBhcnR5IGNsaWVudCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhyb3VnaCBzdXBwb3J0ZWQgZW5kcG9pbnRzLiAgRW5zdXJlIHlvdSBzdG9yZSB0aGUgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gIGFsb25nIHdpdGggdGhlIGB1c2VyX3Rva2VuYCBhbmQgYHRoaXJkX3BhcnR5X2NsaWVudF9pZGAsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBkZWxldGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBPbmNlIHJlbW92ZWQsIHRoZSB0b2tlbiBjYW4gbG9uZ2VyIGJlIHVzZWQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiAgIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5hYmxlIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYCBmb3IgdXNlIHdpdGggQ29uc3VtZXIgUmVwb3J0cyBieSBQbGFpZCBDaGVjaywgYnkgYWRkaW5nIGEgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgdG8gdGhlIHVzZXIuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBTcGVjaWZ5IHRoZSBlLXdhbGxldCB0byBkZWJpdCBmcm9tLCB0aGUgY291bnRlcnBhcnR5IHRvIGNyZWRpdCB0bywgdGhlIGlkZW1wb3RlbmN5IGtleSB0byBwcmV2ZW50IGR1cGxpY2F0ZSB0cmFuc2FjdGlvbnMsIHRoZSBhbW91bnQgYW5kIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBUcmFuc2FjdGlvbnMgd2lsbCBzZXR0bGUgaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyBwYXltZW50IHJhaWwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYW4gZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QgVGhlIGVudGl0eSBzY3JlZW5pbmcgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICB9XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gZmFjdG9yeSBpbnRlcmZhY2VcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpRmFjdG9yeSA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbiwgYmFzZVBhdGg/OiBzdHJpbmcsIGF4aW9zPzogQXhpb3NJbnN0YW5jZSkge1xuICAgIGNvbnN0IGxvY2FsVmFyRnAgPSBQbGFpZEFwaUZwKGNvbmZpZ3VyYXRpb24pXG4gICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzLCBzdWNoIGFzIGAvYWNjb3VudHMvZ2V0YCwgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgZXhpc3RpbmcgSXRlbXMgdGhhdCB3ZXJlIGFkZGVkIHZpYSBhbnkgb2YgUGxhaWTigJlzIG90aGVyIHByb2R1Y3RzLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGFzIGxvbmcgYXMgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIGFueSBvdGhlciBwcm9kdWN0LCBgYmFsYW5jZWAgaXRzZWxmIGlzIG5vdCBhIHByb2R1Y3QgdGhhdCBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgYSBQbGFpZCBhcHBsaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXBwbGljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHByb3ZpZGUgYW4gQXVkaXQgQ29weSBvZiBhbnkgQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHRvIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gRm9yIGV4YW1wbGUsIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmIGlmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uIEFuIEF1ZGl0IENvcHkgY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQuICBUbyBncmFudCBhY2Nlc3MgdG8gYW4gQXVkaXQgQ29weSwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIHRoaXJkIHBhcnR5IHdobyBuZWVkcyBhY2Nlc3MuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYGF1ZGl0b3JfaWRgLCBmb3IgZXhhbXBsZSBgZmFubmllX21hZWAuIFlvdeKAmWxsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgQXVkaXQgQ29weSBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0byB3aG9tIHlvdSB3YW50IHRvIGdyYW50IGFjY2VzcyB0byB0aGUgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBBc3NldCBSZXBvcnQsIHdoaWNoIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBieSBwYXNzaW5nIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm4gdmFsdWUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnRzLiAgVGhlIEFzc2V0IFJlcG9ydCB0YWtlcyBzb21lIHRpbWUgdG8gYmUgY3JlYXRlZCBhbmQgaXMgbm90IGF2YWlsYWJsZSBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFRoZSBleGFjdCBhbW91bnQgb2YgdGltZSB0byBjcmVhdGUgdGhlIHJlcG9ydCB3aWxsIHZhcnkgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGRheXMgb2YgaGlzdG9yeSBhcmUgcmVxdWVzdGVkIGFuZCB3aWxsIHR5cGljYWxseSByYW5nZSBmcm9tIGEgZmV3IHNlY29uZHMgdG8gYWJvdXQgb25lIG1pbnV0ZS4gV2hlbiB0aGUgQXNzZXQgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCBQbGFpZCB3aWxsIGZpcmUgYSBgUFJPRFVDVF9SRUFEWWAgd2ViaG9vay4gRm9yIGZ1bGwgZGV0YWlscyBvZiB0aGUgd2ViaG9vayBzY2hlbWEsIHNlZSBbQXNzZXQgUmVwb3J0IHdlYmhvb2tzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3dlYmhvb2tzKS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYW4gQXNzZXQgUmVwb3J0IGF0IGEgbW9tZW50IGluIHRpbWUuIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZS4gVG8gZ2V0IGFuIHVwZGF0ZWQgQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSBQbGFpZC1pbml0aWF0ZWQgYmFuayB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgdG8gZ2V0IHJpc2sgaW5zaWdodHMgZm9yIGEgbGlua2VkIGFjY291bnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIHJpc2sgb2YgYSBiYW5rIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdH0gYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnRfc3luZGljYXRpb24vbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgdGhhdCBoYXZlIGJlZW4gc3luZGljYXRlZCB0byBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGlzIGVuZHBvaW50IHJldHVybnMgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgd2hpY2ggYXJlIHJlZmVyZW5jZXMgdG8gQmVhY29uIFJlcG9ydHMgY3JlYXRlZCBlaXRoZXIgYnkgeW91LCBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciwgdGhhdCBtYXRjaGVkIHRoZSBzcGVjaWZpZWQgQmVhY29uIFVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIGhhdmUgbXVsdGlwbGUgYWN0aXZlIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGF0IG9uY2UuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhbGwgQWNjb3VudHMgbGlua2VkIHRvIHRoaXMgQmVhY29uIFVzZXIuIFRoZSBpbnNpZ2h0cyBmb3IgZWFjaCBhY2NvdW50IGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBCZWFjb24gVXNlci4gIFRoZSBCZWFjb24gVXNlciBpcyByZXR1cm5lZCB3aXRoIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBhIGBzdGF0dXNgIGJhc2VkIG9uIHRoZSBCZWFjb24gTmV0d29yayBkdXBsaWNhdGUgcmVjb3JkIGFuZCBmcmF1ZCBjaGVja3MuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIEJlYWNvbiBVc2VyIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIEJlYWNvbiBVc2VyXFwncyBoaXN0b3J5XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0gb3IgYWRkIG5ldyBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIuICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYW4gaWRlbnRpdHkgZGF0YSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdH0gYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgY2F0ZWdvcmllc1xuICAgICAgICAgKiBAcGFyYW0ge29iamVjdH0gYm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNhdGVnb3JpZXNHZXQoYm9keTogb2JqZWN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENhdGVnb3JpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc2VudEV2ZW50c0dldFJlcXVlc3R9IGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q29uc2VudEV2ZW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmVzIGFsbCBleGlzdGluZyBDUkIgQmFuayBJbmNvbWUgYW5kIEJhc2UgcmVwb3J0cyBmb3IgdGhlIGNvbnN1bWVyIGluIFBERiBmb3JtYXQuICBSZXNwb25zZSBpcyBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIFJlcG9ydHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3R9IGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYCBjcmVhdGVzIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3R9IGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUNyZWF0ZShjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdDogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFCYW5rSW5jb21lQ3JlYXRlKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQmFzZSBSZXBvcnQgZm9yIHlvdXIgdXNlciwgYWxsb3dpbmcgeW91IHRvIHJlY2VpdmUgY29tcHJlaGVuc2l2ZSBiYW5rIGFjY291bnQgYW5kIGNhc2ggZmxvdyBkYXRhLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcHJvZHVjdCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCB0aGUgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX25ldHdvcmtfYXR0cmlidXRlc2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgYXR0cmlidXRlcyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgY2FsbCBvdXIgcGFydG5lcnMgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBDb25zdW1lciBSZXBvcnRzIGFzIGEgUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHMuXG4gICAgICAgICAqIEBwYXJhbSB7Q1JBTG9hbnNSZWdpc3RlclJlcXVlc3R9IGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdDogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUxvYW5zVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBsaW5rZWQgQ1JBIGl0ZW1zLCB3aGljaCBhcmUgdXBkYXRlZCBldmVyeSBkYXkgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlIGZyb20gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIHRoZSBlbXBsb3ltZW50IHJlcG9ydChzKSBkZXJpdmVkIGZyb20gYmFuayB0cmFuc2FjdGlvbiBkYXRhIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuIElmIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpLmUuIGRlbGV0ZWQpLCB0aGUgZW5kcG9pbnQgd2lsbCByZWZyZXNoIHRoZSBtb3N0IHJlY2VudCB2YWxpZCByZXBvcnQgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYHJpc2tfc2lnbmFsc2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBmcmF1ZCBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBtYW51YWxseSB1cGxvYWRlZCBkb2N1bWVudChzKS5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmdldFJlY2lwaWVudChyZWNpcGllbnRJZCwgb0FVVEhTVEFURUlELCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50cyhvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEdldFJlY2lwaWVudHNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZ2V0UmVjaXBpZW50cyhvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdDogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlSZWZyZXNoUmVxdWVzdH0gaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGJ5IHRoZSBgY2xpZW50X3VzZXJfaWRgIGZpZWxkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiB5b3UgZG9uXFwndCBrbm93IHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgdXNlciBhbHJlYWR5IGhhcyBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB5b3UgY2FuIHNwZWNpZnkgYFxcXCJpc19pZGVtcG90ZW50XFxcIjogdHJ1ZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gV2l0aCBpZGVtcG90ZW5jeSBlbmFibGVkLCBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bm1vZGlmaWVkIHdpdGggYW4gYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBlbmRwb2ludCB0byBzdXBwbHkgaW5mb3JtYXRpb24geW91IGFscmVhZHkgaGF2ZSBjb2xsZWN0ZWQgYWJvdXQgdGhlIHVzZXI7IGlmIGFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhlIHNjcmVlbnMgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZW0gd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgTGluayBmbG93LiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnQgaG9sZGluZ3MgYW5kIHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGZvciBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJc3N1ZXNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgYSB1c2VyIHRvIHN1YnNjcmliZSB0byB1cGRhdGVzIG9uIGEgc3BlY2lmaWMgYElzc3VlYCB1c2luZyBhIFBPU1QgbWV0aG9kLiBTdWJzY3JpYmVycyB3aWxsIHJlY2VpdmUgd2ViaG9vayBub3RpZmljYXRpb25zIHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgd2hlbiByZXNvbHZlZC5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU3Vic2NyaWJlUmVxdWVzdH0gaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1N1YnNjcmliZShpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0uIEZvciBtb25leSBtb3ZlbWVudCBwcm9kdWN0cyBzdWNoIGFzIEF1dGggYW5kIFRyYW5zZmVyLCBpZiB0aGUgSXRlbSBpcyBhdCBhbiBpbnN0aXR1dGlvbiB0aGF0IHVzZXMgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoVEFOcyksIHN1Y2ggYXMgQ2hhc2Ugb3IgUE5DLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIHdpbGwgaW52YWxpZGF0ZSB0aGUgVEFOLCBhbmQgc3Vic2VxdWVudCBBQ0ggdHJhbnNmZXIgYXR0ZW1wdHMgdXNpbmcgdGhhdCBUQU4gd2lsbCBiZSByZXR1cm5lZC4gIEluIExpbWl0ZWQgUHJvZHVjdGlvbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgTGltaXRlZCBQcm9kdWN0aW9uIEl0ZW1zIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYC4gRm9yIG1vc3QgUGxhaWQgcHJvZHVjdHMsIHRoZSBgcHVibGljX3Rva2VuYCBpcyBzYXZlZCBhbmQgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgZnJvbSBhIGxpc3Qgb2YgYGFjY2Vzc190b2tlbnNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGluc2lnaHRzIGZvciB0aGUgcHJvdmlkZWQgYGFjY2Vzc190b2tlbnNgXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdH0gbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0OiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLCBhbmQgc3RhbmRpbmcgb3JkZXJzLCB2YXJpYWJsZSByZWN1cnJpbmcgcGF5bWVudHMsIGFuZCBWaXJ0dWFsIEFjY291bnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIFRvIHJldm9rZSB0aGUgcHJvY2Vzc29yXFwncyBhY2Nlc3MsIHRoZSBlbnRpcmUgSXRlbSBtdXN0IGJlIGRlbGV0ZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIHVwZGF0ZSBmb3IgY2FzaGZsb3cgdXBkYXRlcyAoTW9uaXRvcmluZykgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoZmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdDogU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIHNhbWUgZGF5IG1pY3JvLWRlcG9zaXQgaXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25z4oCZIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgQ2hhc2UgYW5kIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgaXRlbShzKSBmb3IgYSBTYW5kYm94IFVzZXIgaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb24gSXRlbXMgd2hlcmUgU2lnbmFsIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFNpZ25hbCB3aWxsIGhhdmUgYWNjZXNzIHRvIGxlc3MgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBTaWduYWwgc2NvcmUuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gaXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3R9IHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBFbnJpY2ggbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gICBXaGVuIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGZvciBiZXN0IHJlc3VsdHMsIG1ha2Ugc3VyZSB0byB1c2UgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgcGFyYW1ldGVyIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBJdGVtcyB3aXRoIFRyYW5zYWN0aW9ucy4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhlIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIFRyYW5zYWN0aW9ucyBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYC4gIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gb3B0aW9uYWwgYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHRyYW5zYWN0aW9uIGNhdGVnb3J5IHJ1bGVcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdHJhbnNhY3Rpb24gcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgdG8gZGV0ZXJtaW5lIHRoZSBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYW4gYWNjb3VudCB0byBiZSB1c2VkIHdpdGggVHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgd29ya3Mgb24gYWxsIFRyYW5zZmVyLWNhcGFibGUgSXRlbXMsIGluY2x1ZGluZyB0aG9zZSBjcmVhdGVkIGJ5IGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YC4gVG8gc2ltdWxhdGUgUlRQIGVsaWdpYmlsaXR5IGluIFNhbmRib3gsIGxvZyBpbiB1c2luZyB0aGUgdXNlcm5hbWUgYHVzZXJfZ29vZGAgYW5kIHBhc3N3b3JkIGBwYXNzX2dvb2RgIGFuZCB1c2UgdGhlIGZpcnN0IHR3byBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cyBpbiB0aGUgXFxcIkZpcnN0IFBsYXR5cHVzIEJhbmtcXFwiIGluc3RpdHV0aW9uIChlbmRpbmcgaW4gMDAwMCBvciAxMTExKSwgd2hpY2ggd2lsbCByZXR1cm4gYHRydWVgLiBBbnkgb3RoZXIgYWNjb3VudCB3aWxsIHJldHVybiBgZmFsc2VgLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgaXMgcmV0cnlhYmxlIGFuZCBpZGVtcG90ZW50OyBpZiBhIHRyYW5zZmVyIHdpdGggdGhlIHByb3ZpZGVkIGB0cmFuc2Zlcl9pZGAgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBpdCB3aWxsIHJldHVybiB0aGUgdHJhbnNmZXIgZGV0YWlscyB3aXRob3V0IGNyZWF0aW5nIGEgbmV3IHRyYW5zZmVyLiBBIHRyYW5zZmVyIG1heSBzdGlsbCBiZSBjcmVhdGVkIGlmIGEgNTAwIGVycm9yIGlzIHJldHVybmVkOyB0byBkZXRlY3QgdGhpcyBzY2VuYXJpbywgdXNlIFtUcmFuc2ZlciBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvcmVjb25jaWxpbmctdHJhbnNmZXJzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC90cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBVc2UgdGhlIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgZW5kcG9pbnQgdG8gZ3VhcmFudGVlIHlvdSBoYXZlIHNlZW4gYWxsIHRyYW5zZmVyIGV2ZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgdG8gaW52b2tlIHRoZSBUcmFuc2ZlciBVSVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9nZXRgIGVuZHBvaW50IHRvIHJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudEdldFJlcXVlc3R9IHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdDogVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYCBlbmRwb2ludCB0byBtb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzLlxuICAgICAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2xpc3RgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFsbCBvZiB5b3VyIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmcuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgYWxsb3dzIGdhdGhlcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYXRvciBzcGVjaWZpYyB0byB0aGUgU2NhbGVkIFBsYXRmb3JtIFRyYW5zZmVyIG9mZmVyaW5nLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmF0b3JcXCdzIGFncmVlbWVudCB0byBsZWdhbCB0ZXJtcyByZXF1aXJlZCBiZWZvcmUgYWNjZXB0aW5nIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBzY2FsZWQgcGxhdGZvcm0gY3VzdG9tZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCBhbGxvd3MgcGxhdGZvcm1zIHRvIHN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgYW4gb3JpZ2luYXRvciBhcyBwYXJ0IG9mIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgU2NhbGVkIFBsYXRmb3JtIG9yaWdpbmF0b3JzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3F1ZXN0aW9ubmFpcmUvY3JlYXRlYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuIFJlZGlyZWN0IHRoZSBvcmlnaW5hdG9yIHRvIHRoaXMgVVJMIHRvIHByb3ZpZGUgdGhlaXIgZHVlIGRpbGlnZW5jZSBpbmZvcm1hdGlvbiBhbmQgYWdyZWUgdG8gUGxhaWTigJlzIHRlcm1zIGZvciBBQ0ggbW9uZXkgbW92ZW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHJlY3VycmluZyB0cmFuc2Zlci4gVGhpcyBjYXBhYmlsaXR5IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBUcmFuc2ZlciBVSSBvciBQbGF0Zm9ybSBQYXltZW50cyAoYmV0YSkgY3VzdG9tZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUmVmdW5kcyBjb21lIG91dCBvZiB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb2YgdGhlIGxlZGdlciB1c2VkIGZvciB0aGUgb3JpZ2luYWwgZGViaXQgdHJhbnNmZXIuIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGZ1bmRzIGluIHRoZSBhdmFpbGFibGUgYmFsYW5jZSB0byBjb3ZlciB0aGUgcmVmdW5kIGFtb3VudCwgdGhlIHJlZnVuZCB3aWxsIGJlIHJlamVjdGVkLiBZb3UgY2FuIGNyZWF0ZSBhIHJlZnVuZCBhdCBhbnkgdGltZS4gUGxhaWQgZG9lcyBub3QgaW1wb3NlIGFueSBob2xkIHRpbWUgb24gcmVmdW5kcy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIHNldCBvZiByZXR1cm5zIHRoYXQgd2VyZSBiYXRjaGVkIHRvZ2V0aGVyIGludG8gdGhlIHNwZWNpZmllZCByZXBheW1lbnQuIFRoZSBzdW0gb2YgYW1vdW50cyBvZiByZXR1cm5zIHJldHJpZXZlZCBieSB0aGlzIHJlcXVlc3QgZXF1YWxzIHRoZSBhbW91bnQgb2YgdGhlIHJlcGF5bWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHVzZXIgcGVybWlzc2lvbmVkIGFjY291bnQgZGF0YSBpbmNsdWRpbmcgaWRlbnRpdHkgYW5kIEl0ZW0gYWNjZXNzIHRva2Vucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIENoZWNrIG9yIEluY29tZSBmbG93LCBvciBhIE11bHRpLUl0ZW0gTGluayBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBUaGUgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXIgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VySXRlbXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckl0ZW1zR2V0KHVzZXJJdGVtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgdXNlciB0b2tlbiBhbmQgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbi4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdXNlciBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUmVtb3ZlUmVxdWVzdH0gdXNlclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyUmVtb3ZlKHVzZXJSZW1vdmVSZXF1ZXN0OiBVc2VyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBkZWxldGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBPbmNlIHJlbW92ZWQsIHRoZSB0b2tlbiBjYW4gbG9uZ2VyIGJlIHVzZWQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiAgIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAgZm9yIHVzZSB3aXRoIENvbnN1bWVyIFJlcG9ydHMgYnkgUGxhaWQgQ2hlY2ssIGJ5IGFkZGluZyBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IHRvIHRoZSB1c2VyLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0OiBVc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxVc2VyVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBjdXJyZW50IGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdDogV2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlLXdhbGxldCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGVudGl0eSBzY3JlZW5pbmdzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICAgICAqIEBwYXJhbSB7V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3R9IHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuXG4vKipcbiAqIFBsYWlkQXBpIC0gb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZVxuICogQGV4cG9ydFxuICogQGNsYXNzIFBsYWlkQXBpXG4gKiBAZXh0ZW5kcyB7QmFzZUFQSX1cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYWlkQXBpIGV4dGVuZHMgQmFzZUFQSSB7XG4gICAgLyoqXG4gICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICogQHBhcmFtIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0fSBhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3Q6IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIGxpc3Qgb2YgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFueSBsaW5rZWQgSXRlbS4gUGxhaWQgd2lsbCBvbmx5IHJldHVybiBhY3RpdmUgYmFuayBhY2NvdW50cyDigJQgdGhhdCBpcywgYWNjb3VudHMgdGhhdCBhcmUgbm90IGNsb3NlZCBhbmQgYXJlIGNhcGFibGUgb2YgY2FycnlpbmcgYSBiYWxhbmNlLiBUbyByZXR1cm4gbmV3IGFjY291bnRzIHRoYXQgd2VyZSBjcmVhdGVkIGFmdGVyIHRoZSB1c2VyIGxpbmtlZCB0aGVpciBJdGVtLCB5b3UgY2FuIGxpc3RlbiBmb3IgdGhlIFtgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNuZXdfYWNjb3VudHNfYXZhaWxhYmxlKSB3ZWJob29rIGFuZCB0aGVuIHVzZSBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8pIHRvIHJlcXVlc3QgdGhhdCB0aGUgdXNlciBzaGFyZSB0aGlzIG5ldyBhY2NvdW50IHdpdGggeW91LiAgYC9hY2NvdW50cy9nZXRgIGlzIGZyZWUgdG8gdXNlIGFuZCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBUaGUgYmFsYW5jZSByZXR1cm5lZCB3aWxsIHJlZmxlY3QgdGhlIGJhbGFuY2UgYXQgdGhlIHRpbWUgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBJdGVtIHVwZGF0ZS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgYSByZWd1bGFybHkgdXBkYXRpbmcgcHJvZHVjdCwgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIEludmVzdG1lbnRzLCBvciBMaWFiaWxpdGllcywgdGhlIGJhbGFuY2Ugd2lsbCB0eXBpY2FsbHkgdXBkYXRlIGFib3V0IG9uY2UgYSBkYXksIGFzIGxvbmcgYXMgdGhlIEl0ZW0gaXMgaGVhbHRoeS4gSWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBvbmx5IGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBmcmVxdWVudGx5IHVwZGF0ZSwgc3VjaCBhcyBBdXRoIG9yIElkZW50aXR5LCBiYWxhbmNlIGRhdGEgbWF5IGJlIG11Y2ggb2xkZXIuICBGb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBwYWlkIGVuZHBvaW50IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IFBsYWlkIGNsaWVudHMgZm9yIHRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIGNvbnRyb2wtdG93ZXIgZXhwZXJpZW5jZXNcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtBcHBsaWNhdGlvbkdldFJlcXVlc3R9IGFwcGxpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGAgYWxsb3dzIGF1ZGl0b3JzIHRvIGdldCBhIGNvcHkgb2YgYW4gQXNzZXQgUmVwb3J0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2hhcmVkIHZpYSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50LiAgVGhlIGNhbGxlciBvZiBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgbXVzdCBwcm92aWRlIHRoZSBgYXVkaXRfY29weV90b2tlbmAgdG8gdGhlIGF1ZGl0b3IuICBUaGlzIHRva2VuIGNhbiB0aGVuIGJlIHVzZWQgdG8gY2FsbCBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydCwgdGhlIEFzc2V0IFJlcG9ydCBpdHNlbGYgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBKU09OIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCBpbmNsdWRlcyB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbnMgYXMgcmV0dXJuZWQgYnkgdGhlIGJhbmssIGFzIG9wcG9zZWQgdG8gcGFyc2VkIGFuZCBjYXRlZ29yaXplZCBieSBQbGFpZC4gWW91IGNhbiBhbHNvIHJlY2VpdmUgY2xlYW5lZCBhbmQgY2F0ZWdvcml6ZWQgdHJhbnNhY3Rpb25zLCBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgaW5zaWdodHMgbGlrZSBtZXJjaGFudCBuYW1lIG9yIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBXZSBjYWxsIHRoaXMgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuIEFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzIHByb3ZpZGVzIHRyYW5zYWN0aW9uIGNhdGVnb3J5LCBsb2NhdGlvbiwgYW5kIG1lcmNoYW50IGluZm9ybWF0aW9uIGluIGFkZGl0aW9uIHRvIHRoZSB0cmFuc2FjdGlvbiBzdHJpbmdzIHByb3ZpZGVkIGluIGEgc3RhbmRhcmQgQXNzZXQgUmVwb3J0LiBUbyByZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cywgY2FsbCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHdpdGggYGluY2x1ZGVfaW5zaWdodHNgIHNldCB0byBgdHJ1ZWAuICBGb3IgbGF0ZW5jeS1zZW5zaXRpdmUgYXBwbGljYXRpb25zLCB5b3UgY2FuIG9wdGlvbmFsbHkgY2FsbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLiBUaGlzIHdpbGwgY2F1c2UgUGxhaWQgdG8gY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiBvbmUgd2l0aCBvbmx5IGN1cnJlbnQgYW5kIGF2YWlsYWJsZSBiYWxhbmNlIGFuZCBpZGVudGl0eSBpbmZvcm1hdGlvbiwgYW5kIHRoZW4gbGF0ZXIgb24gdGhlIGNvbXBsZXRlIEFzc2V0IFJlcG9ydC4gWW91IHdpbGwgcmVjZWl2ZSBzZXBhcmF0ZSB3ZWJob29rcyBmb3IgZWFjaCB2ZXJzaW9uIG9mIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFBkZkdldChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0fSBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcsIHNhdmluZ3MsIGFuZCBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0aEdldChhdXRoR2V0UmVxdWVzdDogQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYmFsYW5jZSBvZiB5b3VyIEJhbmsgVHJhbnNmZXIgYWNjb3VudFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgYmFuayB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAgZW5kcG9pbnQgdG8gZ2V0IGEgbGlzdCBvZiBQbGFpZC1pbml0aWF0ZWQgQUNIIG9yIGJhbmsgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuIFdoZW4gdXNpbmcgQXV0aCB3aXRoIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGVuYWJsZWQsIHRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggc3RhdHVzIHVwZGF0ZXMgb24gQUNIIG1pY3JvLWRlcG9zaXRzLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW21pY3JvLWRlcG9zaXQgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFuayB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgYmFua190cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciBiYW5rIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIGJhbmsgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuICBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEJhbmsgVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgTWlncmF0ZSBhY2NvdW50IGludG8gQmFuayBUcmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgdG8gZ2V0IHJpc2sgaW5zaWdodHMgZm9yIGEgbGlua2VkIGFjY291bnQuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAqIEBwYXJhbSB7QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3R9IGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdDogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgZnJhdWQgcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiBVc2VyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdDogQmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdDogQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhbGwgQWNjb3VudHMgbGlua2VkIHRvIHRoaXMgQmVhY29uIFVzZXIuIFRoZSBpbnNpZ2h0cyBmb3IgZWFjaCBhY2NvdW50IGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdH0gYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSBCZWFjb24gVXNlci4gIFRoZSBCZWFjb24gVXNlciBpcyByZXR1cm5lZCB3aXRoIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIGFuZCBhIGBzdGF0dXNgIGJhc2VkIG9uIHRoZSBCZWFjb24gTmV0d29yayBkdXBsaWNhdGUgcmVjb3JkIGFuZCBmcmF1ZCBjaGVja3MuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIEJlYWNvbiBVc2VyIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiBhIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdmlhIHRoaXMgZW5kcG9pbnQsIFBsYWlkIHZhbGlkYXRlcyB0aGF0IHRoZSBzdGF0dXMgY2hhbmdlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVsYXRlZCBzdGF0ZSBmb3IgdGhpcyBCZWFjb24gVXNlci4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGNoZWNrOiAgMS4gV2hldGhlciB0aGVyZSBhcmUgYW55IGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydHMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlciwgYW5kIDIuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgY29ubmVjdGVkIHRvIHRoZSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJyZWplY3RlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCBlaXRoZXIgYSBCZWFjb24gUmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBCZWFjb24gVXNlciBvciBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gaGFzIGJlZW4gY29uZmlybWVkLiBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIsIHdlIGVuZm9yY2UgdGhhdCB0aGVyZSBhcmUgbm8gYWN0aXZlIEJlYWNvbiBSZXBvcnRzIG9yIGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIElmIHlvdSBwcmV2aW91c2x5IGNyZWF0ZWQgYSBCZWFjb24gUmVwb3J0IGZvciB0aGlzIHVzZXIsIHlvdSBtdXN0IGRlbGV0ZSBpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicGVuZGluZ19yZXZpZXdcXFwiLiAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIGlzc3VlLlxuICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgaWRlbnRpdHkgZGF0YSBmb3IgYSBCZWFjb24gVXNlciBpbiB5b3VyIEJlYWNvbiBQcm9ncmFtIG9yIGFkZCBuZXcgYWNjb3VudHMgdG8gdGhlIEJlYWNvbiBVc2VyLiAgU2ltaWxhciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHkgd2hlbiB5b3Ugc3VibWl0IGFuIGlkZW50aXR5IGRhdGEgY2hhbmdlIHRvIGAvYmVhY29uL3VzZXIvdXBkYXRlYDogICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuICBQbGFpZCBtYWludGFpbnMgYSB2ZXJzaW9uIGhpc3RvcnkgZm9yIGVhY2ggQmVhY29uIFVzZXIsIHNvIHRoZSBCZWFjb24gVXNlclxcJ3MgaWRlbnRpdHkgZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUgaXMgcmV0YWluZWQgYXMgc2VwYXJhdGUgdmVyc2lvbnMuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgY2F0ZWdvcmllc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBJdGVtIGNvbnNlbnQgZXZlbnRzLiBDb25zZW50IGxvZ3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBldmVudHMgb2NjdXJyaW5nIG9uIG9yIGFmdGVyIE5vdmVtYmVyIDcsIDIwMjQuIFVwIHRvIHRocmVlIHllYXJzIG9mIGNvbnNlbnQgbG9ncyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgdGhlIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlcyBhbGwgZXhpc3RpbmcgQ1JCIEJhbmsgSW5jb21lIGFuZCBCYXNlIHJlcG9ydHMgZm9yIHRoZSBjb25zdW1lciBpbiBQREYgZm9ybWF0LiAgUmVzcG9uc2UgaXMgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIFJlcG9ydHNcbiAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAgY3JlYXRlcyBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdH0gY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFCYW5rSW5jb21lQ3JlYXRlKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0OiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEJhc2UgUmVwb3J0IGZvciB5b3VyIHVzZXIsIGFsbG93aW5nIHlvdSB0byByZWNlaXZlIGNvbXByZWhlbnNpdmUgYmFuayBhY2NvdW50IGFuZCBjYXNoIGZsb3cgZGF0YS4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc25cXCd0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBCYXNlIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNyZWF0ZXMgYSBDb25zdW1lciBSZXBvcnQgcG93ZXJlZCBieSBQbGFpZCBDaGVjay4gWW91IGNhbiBjYWxsIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHJlcG9ydCBpZiBgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2VgIHdhcyBvbWl0dGVkIGR1cmluZyBMaW5rIHRva2VuIGNyZWF0aW9uLiBJZiB5b3UgZGlkIHByb3ZpZGUgYSBgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2VgIGR1cmluZyBMaW5rIHRva2VuIGNyZWF0aW9uLCB0aGVuIFBsYWlkIENoZWNrIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBjcmVhdGluZyBhIENvbnN1bWVyIFJlcG9ydCBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgTGluayBwcm9jZXNzLCBhbmQgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGJlZm9yZSByZXRyaWV2aW5nIHRoZSByZXBvcnQuICAgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB0byByZWZyZXNoIGRhdGEgaW4gYW4gZXhpc3RpbmcgcmVwb3J0LiBBIENvbnN1bWVyIFJlcG9ydCB3aWxsIGxhc3QgZm9yIDI0IGhvdXJzIGJlZm9yZSBleHBpcmluZzsgeW91IHNob3VsZCBjYWxsIGFueSBgL2dldGAgZW5kcG9pbnRzIG9uIHRoZSByZXBvcnQgYmVmb3JlIGl0IGV4cGlyZXMuIElmIGEgcmVwb3J0IGV4cGlyZXMsIHlvdSBjYW4gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBhZ2FpbiB0byByZS1nZW5lcmF0ZSBpdC4gTm90ZSB0aGF0IHJlZnJlc2hpbmcgb3IgcmVnZW5lcmF0aW5nIGEgcmVwb3J0IGlzIGEgYmlsbGFibGUgZXZlbnQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQ29uc3VtZXIgUmVwb3J0XG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRDcmVhdGUoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9uZXR3b3JrX2F0dHJpYnV0ZXNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZXMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgY2FsbCBvdXIgcGFydG5lcnMgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSBwYXJ0bmVyc1xuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgIHJldHJpZXZlcyB0aGUgbW9zdCByZWNlbnQgQ29uc3VtZXIgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJ5IGRlZmF1bHQsIHRoZSBtb3N0IHJlY2VudCBCYXNlIFJlcG9ydCAoaWYgaXQgZXhpc3RzKSBmb3IgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZC4gVG8gcmVxdWVzdCB0aGF0IHRoZSBtb3N0IHJlY2VudCBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGJlIGluY2x1ZGVkIGluIHRoZSBQREYgYXMgd2VsbCwgdXNlIHRoZSBgYWRkLW9uc2AgZmllbGQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQ29uc3VtZXIgUmVwb3J0cyBhcyBhIFBERlxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYCByZWdpc3RlcnMgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAqIEBwYXJhbSB7Q1JBTG9hbnNSZWdpc3RlclJlcXVlc3R9IGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgKiBAc3VtbWFyeSBVbnJlZ2lzdGVyIGEgbGlzdCBvZiBsb2Fucy5cbiAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9sb2Fucy91cGRhdGVgIHVwZGF0ZXMgbG9hbiBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBzdGF0dXMgYW5kIHBheW1lbnQgaGlzdG9yeS5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBpdGVtcywgd2hpY2ggYXJlIHVwZGF0ZWQgZXZlcnkgZGF5IChiZXN0LWVmZm9ydCkuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgKiBAc3VtbWFyeSBVbnN1YnNjcmliZSBmcm9tIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YCByZXR1cm5zIGNhc2ggZmxvdyBpbnNpZ2h0cyBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhUGFydG5lckluc2lnaHRzR2V0KGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkLiBOZXcgUGxhaWQgY3VzdG9tZXJzIHdpbGwgYmUgdW5hYmxlIHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhbmQgZXhpc3RpbmcgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIG1pZ3JhdGUgdG8gdGhlIG5ld2VyLCBgbGlua190b2tlbmAtYmFzZWQgZmxvdy4gVGhlIHJlY29tbWVuZGVkIGZsb3cgaXMgdG8gcHJvdmlkZSB0aGUgYHBheW1lbnRfaWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgLCB3aGljaCByZXR1cm5zIGEgYGxpbmtfdG9rZW5gIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiAgVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYCBpcyB1c2VkIHRvIGNyZWF0ZSBhIGBwYXltZW50X3Rva2VuYCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBpbiBMaW5rIGluaXRpYWxpemF0aW9uIHRvIGVudGVyIGEgcGF5bWVudCBpbml0aWF0aW9uIGZsb3cuIFlvdSBjYW4gb25seSB1c2UgYSBgcGF5bWVudF90b2tlbmAgb25jZS4gSWYgdGhpcyBhdHRlbXB0IGZhaWxzLCB0aGUgZW5kIHVzZXIgYWJvcnRzIHRoZSBmbG93LCBvciB0aGUgdG9rZW4gZXhwaXJlcywgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCB0b2tlbi4gQ3JlYXRpbmcgYSBuZXcgcGF5bWVudCB0b2tlbiBkb2VzIG5vdCByZXF1aXJlIGVuZCB1c2VyIGlucHV0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEZyZWRkaWUgTWFjXFwncyBKU09OIGZvcm1hdC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIGNyZWF0ZSBhbiBBdWRpdCBDb3B5IHRva2VuIG9mIGFuIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCB0byBzaGFyZSB3aXRoIHBhcnRpY2lwYXRpbmcgR292ZXJubWVudCBTcG9uc29yZWQgRW50aXR5IChHU0UpLiBJZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgdG9rZW4gZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZi4gQW4gQXVkaXQgQ29weSB0b2tlbiBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydCBhbmQvb3IgSW5jb21lIFJlcG9ydCAocmVzdWx0IG9mIC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0KS4gIFVzZSB0aGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSBHU0Ugd2hvIG5lZWRzIGFjY2Vzcy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi91cGRhdGVgIGVuZHBvaW50IHVwZGF0ZXMgYW4gZXhpc3RpbmcgIEF1ZGl0IENvcHkgVG9rZW4gYnkgYWRkaW5nIHRoZSByZXBvcnQgdG9rZW5zIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQgdG8gdGhlIGBhdWRpdF9jb3B5X3Rva2VuYC4gSWYgdGhlIEF1ZGl0IENvcHkgVG9rZW4gYWxyZWFkeSBjb250YWlucyBhIHJlcG9ydCBvZiBhIGNlcnRhaW4gdHlwZSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b2tlbiBwcm92aWRlZCBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGUoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIHRoZSBlbXBsb3ltZW50IHJlcG9ydChzKSBkZXJpdmVkIGZyb20gYmFuayB0cmFuc2FjdGlvbiBkYXRhIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLiBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS4gVG8gcmV0dXJuIG9sZGVyIHJlcG9ydHMsIHVzZSB0aGUgYG9wdGlvbnMuY291bnRgIGZpZWxkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBQREYgZm9ybWF0XG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci4gSWYgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBpcyBubyBsb25nZXIgdmFsaWQgKGkuZS4gZGVsZXRlZCksIHRoZSBlbmRwb2ludCB3aWxsIHJlZnJlc2ggdGhlIG1vc3QgcmVjZW50IHZhbGlkIHJlcG9ydCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBkYXRhIGZvciBhIHVzZXJcXCdzIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50c1xuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aXRoIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZnJvbSBhIHVzZXJcXCdzIHBheXJvbGwgcHJvdmlkZXIgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RW1wbG95bWVudEdldChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdH0gY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgdGhhdCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXppbmcgYSBMaW5rIHNlc3Npb24gZm9yIGluY29tZSB2ZXJpZmljYXRpb24uIEl0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gdXNlciBpcyBzdXBwb3J0YWJsZSBieSBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24uIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgdGhhdCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0b2tlbiwgYW5kIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIHVzZXIgY2FuIHN0aWxsIHVzZSB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LCBidXQgdGhleSBtYXkgYmUgcmVxdWlyZWQgdG8gbWFudWFsbHkgdXBsb2FkIGEgcGF5c3R1YiB0byB2ZXJpZnkgdGhlaXIgaW5jb21lLiAgV2hpbGUgYWxsIHJlcXVlc3QgZmllbGRzIGFyZSBvcHRpb25hbCwgcHJvdmlkaW5nIGBlbXBsb3llcmAgZGF0YSB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2Ugb2YgcmVjZWl2aW5nIGEgdXNlZnVsIHJlc3VsdC4gIFdoZW4gdGVzdGluZyBpbiBTYW5kYm94LCB5b3UgY2FuIGNvbnRyb2wgdGhlIHJlc3VsdHMgYnkgcHJvdmlkaW5nIHNwZWNpYWwgdGVzdCB2YWx1ZXMgaW4gdGhlIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBmaWVsZHMuIGBlbXBsb3llcl9nb29kYCBhbmQgYGVtcGxveWVyX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBgZW1wbG95ZXJfbXVsdGlgIHdpbGwgcmVzdWx0IGluIGEgYEhJR0hgIGNvbmZpZGVuY2Ugd2l0aCBtdWx0aXBsZSBwYXlyb2xsIG9wdGlvbnMuIExpa2V3aXNlLCBgYWNjZXNzX2dvb2RgIGFuZCBgYWNjZXNzX2JhZGAgd2lsbCByZXN1bHQgaW4gYEhJR0hgIGFuZCBgTE9XYCBjb25maWRlbmNlIHZhbHVlcywgcmVzcGVjdGl2ZWx5LiBBbnkgb3RoZXIgdmFsdWUgZm9yIGBlbXBsb3llcmAgYW5kIGBhY2Nlc3NfdG9rZW5zYCBpbiBTYW5kYm94IHdpbGwgcmVzdWx0IGluIGBVTktOT1dOYCBjb25maWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjayhjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZnJhdWQgaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbWFudWFsbHkgdXBsb2FkZWQgZG9jdW1lbnQocykuXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHBkZiByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gIFRoZSBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLiAgW1ZpZXcgYSBzYW1wbGUgUERGIEFzc2V0IFJlcG9ydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3NhbXBsZS1hc3NldC1yZXBvcnQucGRmKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UGRmR2V0KGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3R9IGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYSBgcmVsYXlfdG9rZW5gLiBUaGUgdGhpcmQgcGFydHkgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBhY2Nlc3Mgb3IgcmVmcmVzaCB0aGUgcmVwb3J0cyB3aGljaCB0aGUgYHJlbGF5X3Rva2VuYCBnaXZlcyBhY2Nlc3MgdG8uIFRoZSBvcmlnaW5hbCByZXBvcnQsIGFzc29jaWF0ZWQgSXRlbXMsIGFuZCBvdGhlciByZWxheSB0b2tlbnMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGUgc2FtZSByZXBvcnQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gYHJlbGF5X3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaW5rIHNlc3Npb25zIGZvciB5b3VyIHVzZXJcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgZGV0YWlscyAoc3VjaCBhcyBlbWFpbCBhZGRyZXNzKSBhYm91dCBhIHNwZWNpZmljIERhc2hib2FyZCB1c2VyIGJhc2VkIG9uIHRoZSBgZGFzaGJvYXJkX3VzZXJfaWRgIGZpZWxkLCB3aGljaCBpcyByZXR1cm5lZCBpbiB0aGUgYGF1ZGl0X3RyYWlsYCBvYmplY3Qgb2YgY2VydGFpbiBNb25pdG9yIGFuZCBCZWFjb24gZW5kcG9pbnRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyByZXZpZXdlciB3aG8gcGVyZm9ybWVkIGEgRGFzaGJvYXJkIGFjdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGRhc2hib2FyZCB1c2VyXG4gICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiB1c2UgdXNlZCB0byBhdWRpdCBvciB0cmFjayB0aGUgbGlzdCBvZiByZXZpZXdlcnMgZm9yIE1vbml0b3IsIEJlYWNvbiwgYW5kIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGRhc2hib2FyZCB1c2Vyc1xuICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoR2V0KGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZW1wbG95ZXIgZGF0YWJhc2VcbiAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmVtcGxveWVyc1NlYXJjaChlbXBsb3llcnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgKiBAc3VtbWFyeSBXZWJob29rIHJlY2VpdmVyIGZvciBmZHggbm90aWZpY2F0aW9uc1xuICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkOiBzdHJpbmcsIG9BVVRIU1RBVEVJRD86IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmdldFJlY2lwaWVudChyZWNpcGllbnRJZCwgb0FVVEhTVEFURUlELCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBSZWNpcGllbnRzXG4gICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGdldFJlY2lwaWVudHMob3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmdldFJlY2lwaWVudHMob3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICogQHBhcmFtIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLiBPbmx5IG5hbWUgZGF0YSBpcyBndWFyYW50ZWVkIHRvIGJlIHJldHVybmVkOyBvdGhlciBmaWVsZHMgd2lsbCBiZSBlbXB0eSBhcnJheXMgaWYgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGU6IEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eUdldFJlcXVlc3R9IGlkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlHZXQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtJZGVudGl0eU1hdGNoUmVxdWVzdH0gaWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGlkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gYXV0b2ZpbGwgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGJhc2VkIG9mIHRoZSBwcm92aWRlZCBwaG9uZSBudW1iZXIsIGRhdGUgb2YgYmlydGggYW5kIGNvdW50cnkgb2YgcmVzaWRlbmNlLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIGFuZCBsaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnMgY3JlYXRlZCBieSB5b3VyIGFjY291bnRcbiAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdChpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhbiBpbmNvbWUgdmVyaWZpY2F0aW9uIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wYXlzdHVicy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBwYXlzdHVicyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ2hlY2sgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSBmb3JtcyB0aGF0IHdlcmUgdXNlZCB0byB2ZXJpZnkgYW4gZW5kIHVzZXJcXCdcXCdzIGluY29tZS4gSXQgY2FuIGJlIGNhbGxlZCBvbmNlIHRoZSBzdGF0dXMgb2YgdGhlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZXQgdG8gYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWAsIGFzIHJlcG9ydGVkIGJ5IHRoZSBgSU5DT01FOiB2ZXJpZmljYXRpb25fc3RhdHVzYCB3ZWJob29rLiBBdHRlbXB0aW5nIHRvIGNhbGwgdGhlIGVuZHBvaW50IGJlZm9yZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gY29tcGxldGVkIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZ2V0YCBpbnN0ZWFkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhbGwgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiBCZWNhdXNlIFBsYWlkIHN1cHBvcnRzIHRob3VzYW5kcyBvZiBpbnN0aXR1dGlvbnMsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gIElmIHRoZXJlIGlzIG5vIG92ZXJsYXAgYmV0d2VlbiBhbiBpbnN0aXR1dGlvbuKAmXMgZW5hYmxlZCBwcm9kdWN0cyBhbmQgYSBjbGllbnTigJlzIGVuYWJsZWQgcHJvZHVjdHMsIHRoZW4gdGhlIGluc3RpdHV0aW9uIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGZyb20gdGhlIHJlc3BvbnNlLiBBcyBhIHJlc3VsdCwgdGhlIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgcmV0dXJuZWQgbWF5IG5vdCBtYXRjaCB0aGUgY291bnQgc3BlY2lmaWVkIGluIHRoZSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGEgc3BlY2lmaWVkIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IFBsYWlkLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGlzIGVuZHBvaW50LiBUaGUgYHB1YmxpY19rZXlgIGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluc3RpdHV0aW9uc1NlYXJjaChpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdDogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3R9IGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdDogSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGBJc3N1ZWAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIHNpbmdsZSBgSXNzdWVgIG9iamVjdC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgKiBAcGFyYW0ge0lzc3Vlc0dldFJlcXVlc3R9IGlzc3Vlc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpc3N1ZXNHZXQoaXNzdWVzR2V0UmVxdWVzdDogSXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggZm9yIGFuIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogIGBpdGVtX2lkYCwgYGxpbmtfc2Vzc2lvbl9pZGAgb3IgTGluayBzZXNzaW9uIGByZXF1ZXN0X2lkYC4gIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBmb3IgYW4gSXNzdWVcbiAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlzc3Vlc1NlYXJjaChpc3N1ZXNTZWFyY2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgYSB1c2VyIHRvIHN1YnNjcmliZSB0byB1cGRhdGVzIG9uIGEgc3BlY2lmaWMgYElzc3VlYCB1c2luZyBhIFBPU1QgbWV0aG9kLiBTdWJzY3JpYmVycyB3aWxsIHJlY2VpdmUgd2ViaG9vayBub3RpZmljYXRpb25zIHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgd2hlbiByZXNvbHZlZC5cbiAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gYW4gSXNzdWVcbiAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdDogSXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlzc3Vlc1N1YnNjcmliZShpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICogQHBhcmFtIHtJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdH0gaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0fSBpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Q6IEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25MaXN0KGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAqIEBzdW1tYXJ5IFVubGluayBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uVW5saW5rKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICogQHBhcmFtIHtJdGVtR2V0UmVxdWVzdH0gaXRlbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1HZXQoaXRlbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaXRlbS9pbXBvcnRgIGNyZWF0ZXMgYW4gSXRlbSB2aWEgeW91ciBQbGFpZCBFeGNoYW5nZSBJbnRlZ3JhdGlvbiBhbmQgcmV0dXJucyBhbiBgYWNjZXNzX3Rva2VuYC4gQXMgcGFydCBvZiBhbiBgL2l0ZW0vaW1wb3J0YCByZXF1ZXN0LCB5b3Ugd2lsbCBpbmNsdWRlIGEgVXNlciBJRCAoYHVzZXJfYXV0aC51c2VyX2lkYCkgYW5kIEF1dGhlbnRpY2F0aW9uIFRva2VuIChgdXNlcl9hdXRoLmF1dGhfdG9rZW5gKSB0aGF0IGVuYWJsZSBkYXRhIGFnZ3JlZ2F0aW9uIHRocm91Z2ggeW91ciBQbGFpZCBFeGNoYW5nZSBBUEkgZW5kcG9pbnRzLiBUaGVzZSBhdXRoZW50aWNhdGlvbiBwcmluY2lwYWxzIGFyZSB0byBiZSBjaG9zZW4gYnkgeW91LiAgVXBvbiBjcmVhdGluZyBhbiBJdGVtIHZpYSBgL2l0ZW0vaW1wb3J0YCwgUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGFuIGV4dHJhY3Rpb24gb2YgdGhhdCBJdGVtIHRocm91Z2ggdGhlIFBsYWlkIEV4Y2hhbmdlIGluZnJhc3RydWN0dXJlIHlvdSBoYXZlIGFscmVhZHkgaW50ZWdyYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdDogSXRlbUltcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0uIEZvciBtb25leSBtb3ZlbWVudCBwcm9kdWN0cyBzdWNoIGFzIEF1dGggYW5kIFRyYW5zZmVyLCBpZiB0aGUgSXRlbSBpcyBhdCBhbiBpbnN0aXR1dGlvbiB0aGF0IHVzZXMgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoVEFOcyksIHN1Y2ggYXMgQ2hhc2Ugb3IgUE5DLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIHdpbGwgaW52YWxpZGF0ZSB0aGUgVEFOLCBhbmQgc3Vic2VxdWVudCBBQ0ggdHJhbnNmZXIgYXR0ZW1wdHMgdXNpbmcgdGhhdCBUQU4gd2lsbCBiZSByZXR1cm5lZC4gIEluIExpbWl0ZWQgUHJvZHVjdGlvbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgTGltaXRlZCBQcm9kdWN0aW9uIEl0ZW1zIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIFdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdDogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdH0gbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBIb3N0ZWQgTGluayBzZXNzaW9uXG4gICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rRGVsaXZlcnlHZXQobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3R9IGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdDogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAuIEZvciBtb3N0IFBsYWlkIHByb2R1Y3RzLCB0aGUgYHB1YmxpY190b2tlbmAgaXMgc2F2ZWQgYW5kIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3Q6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICogQHN1bW1hcnkgR2V0IExpbmsgVG9rZW5cbiAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtUb2tlbkdldChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgZnJvbSBhIGxpc3Qgb2YgYGFjY2Vzc190b2tlbnNgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgaW5zaWdodHMgZm9yIHRoZSBwcm92aWRlZCBgYWNjZXNzX3Rva2Vuc2BcbiAgICAgKiBAcGFyYW0ge05ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3R9IG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdDogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLm5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9uZXR3b3JrL3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgc3RyZWFtbGluZWQgZXhwZXJpZW5jZSwgc3VjaCBhcyBMYXllci4gIE5vdGU6IGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGNoZWNrIGZvciBMYXllciBlbGlnaWJpbGl0eSBpbiB0aGUgZnJvbnRlbmQuIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjaGVja2luZyBMYXllciBlbGlnaWJpbGl0eSBpZiBhIGZyb250ZW5kIGNoZWNrIGlzIG5vdCBwb3NzaWJsZSBmb3IgeW91ciB1c2UgY2FzZS4gRm9yIGluc3RydWN0aW9ucyBvbiBwZXJmb3JtaW5nIGEgZnJvbnRlbmQgZWxpZ2liaWxpdHkgY2hlY2ssIHNlZSB0aGUgW0xheWVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS5cbiAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICogQHBhcmFtIHtOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gbmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLm5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLiBUbyBjcmVhdGUgZW5kIGN1c3RvbWVycywgaXQgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudCBvbmx5LCBldmVuIHdoZW4gY3JlYXRpbmcgU2FuZGJveCBBUEkga2V5cy4gSWYgY2FsbGVkIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBpdCB3aWxsIHJldHVybiBhIHNhbXBsZSByZXNwb25zZSwgYnV0IG5vIGN1c3RvbWVyIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIEFQSSBrZXlzIHdpbGwgbm90IGJlIHZhbGlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIGZ1bGwgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBFbmFibGVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lciBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci4gVG8gbGVhcm4gaG93IHRvIHNldCB1cCBhIHdlYmhvb2sgdG8gbGlzdGVuIHRvIHN0YXR1cyB1cGRhdGUgZXZlbnRzLCB2aXNpdCB0aGUgW3Jlc2VsbGVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9yZXNlbGxlcnMvI2VuYWJsaW5nLWVuZC1jdXN0b21lcnMpLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgcGF5bWVudCBjb25zZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSBwYXltZW50cyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFBheW1lbnQgY29uc2VudHMgYXJlIGNyZWF0ZWQgd2l0aCBgVU5BVVRIT1JJU0VEYCBzdGF0dXMgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBhdXRob3Jpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBwYXltZW50cyBjYW4gYmUgaW5pdGlhdGVkLiAgQ29uc2VudHMgY2FuIGJlIGxpbWl0ZWQgaW4gdGltZSBhbmQgc2NvcGUsIGFuZCBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgZGVzY3JpYmUgbGltaXRhdGlvbnMgZm9yIHBheW1lbnRzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgY29uc3RyYWludHMuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgY29uc2VudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0KHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV2b2tlIHRoZSBwYXltZW50IGNvbnNlbnQuIE9uY2UgdGhlIGNvbnNlbnQgaXMgcmV2b2tlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGluaXRpYXRlIHBheW1lbnRzIHVzaW5nIGl0LlxuICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLCBhbmQgc3RhbmRpbmcgb3JkZXJzLCB2YXJpYWJsZSByZWN1cnJpbmcgcGF5bWVudHMsIGFuZCBWaXJ0dWFsIEFjY291bnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIHBheW1lbnQgYW1vdW50LiBJbiB0aGUgY2FzZSBvZiBzdGFuZGluZyBvcmRlcnMsIHRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIG92ZXJhbGwgc3RhbmRpbmcgb3JkZXIgaXRzZWxmOyB0aGUgQVBJIGNhbm5vdCBiZSB1c2VkIHRvIHJldHJpZXZlIHBheW1lbnQgc3RhdHVzIGZvciBpbmRpdmlkdWFsIHBheW1lbnRzIHdpdGhpbiBhIHN0YW5kaW5nIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbGwgY3JlYXRlZCBwYXltZW50cy4gQnkgZGVmYXVsdCwgdGhlIDEwIG1vc3QgcmVjZW50IHBheW1lbnRzIGFyZSByZXR1cm5lZC4gWW91IGNhbiByZXF1ZXN0IG1vcmUgcGF5bWVudHMgYW5kIHBhZ2luYXRlIHRocm91Z2ggdGhlIHJlc3VsdHMgdXNpbmcgdGhlIG9wdGlvbmFsIGBjb3VudGAgYW5kIGBjdXJzb3JgIHBhcmFtZXRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlIGEgc2V0dGxlZCBwYXltZW50IGZyb20gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQuICBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGJlIGluIGEgc2V0dGxlZCBzdGF0ZSB0byBiZSByZWZ1bmRlZC4gVG8gcmVmdW5kIHBhcnRpYWxseSwgc3BlY2lmeSB0aGUgYW1vdW50IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuIElmIHRoZSBhbW91bnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIHJlZnVuZCBhbW91bnQgd2lsbCBiZSBlcXVhbCB0byBhbGwgb2YgdGhlIHJlbWFpbmluZyBwYXltZW50IGFtb3VudCB0aGF0IGhhcyBub3QgYmVlbiByZWZ1bmRlZCB5ZXQuICBUaGUgcmVmdW5kIHdpbGwgZ28gYmFjayB0byB0aGUgc291cmNlIGFjY291bnQgdGhhdCBpbml0aWF0ZWQgdGhlIHBheW1lbnQuIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgaGF2ZSBiZWVuIGluaXRpYXRlZCB0byBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudCBzbyB0aGF0IHRoaXMgYWNjb3VudCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSB0aGUgcmVmdW5kLiAgUHJvdmlkaW5nIGNvdW50ZXJwYXJ0eSBpbmZvcm1hdGlvbiBzdWNoIGFzIGRhdGUgb2YgYmlydGggYW5kIGFkZHJlc3MgaW5jcmVhc2VzICB0aGUgbGlrZWxpaG9vZCBvZiByZWZ1bmQgYmVpbmcgc3VjY2Vzc2Z1bCB3aXRob3V0IGh1bWFuIGludGVydmVudGlvbi4gXG4gICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnQgcmVjaXBpZW50c1xuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHByb2ZpbGUuIFRvIGluaXRpYXRlIHRoZSBhY2NvdW50IGxpbmtpbmcgZXhwZXJpZW5jZSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCBhbmQgcHJvdmlkZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgaW4gdGhlIGB0cmFuc2Zlci5wYXltZW50X3Byb2ZpbGVfdG9rZW5gIGZpZWxkLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCB3aGVuIGNyZWF0aW5nIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uICBUaGlzIGVuZHBvaW50IHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIEFzIGEgcmVzdWx0LCB0aGUgYWNjb3VudCBiYWxhbmNlIHJldHVybmVkIG1heSBub3QgYmUgdXAtdG8tZGF0ZTsgZm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgaW5zdGVhZC4gTm90ZSB0aGF0IHNvbWUgaW5mb3JtYXRpb24gaXMgbnVsbGFibGUuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JBY2NvdW50R2V0KHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdH0gcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgVGhlICYjeDYwOy9wcm9jZXNzb3IvYmFsYW5jZS9nZXQmI3g2MDsgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuICYjeDYwO3Byb2Nlc3Nvcl90b2tlbiYjeDYwOy4gIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC4gVGhlIGF2YWlsYWJsZSBiYWxhbmNlIGlzIHRoZSBjdXJyZW50IGJhbGFuY2UgbGVzcyBhbnkgb3V0c3RhbmRpbmcgaG9sZHMgb3IgZGViaXRzIHRoYXQgaGF2ZSBub3QgeWV0IHBvc3RlZCB0byB0aGUgYWNjb3VudC4gIE5vdGUgdGhhdCBub3QgYWxsIGluc3RpdHV0aW9ucyBjYWxjdWxhdGUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlLiBJbiB0aGUgZXZlbnQgdGhhdCBhdmFpbGFibGUgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBpbnN0aXR1dGlvbiwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYXZhaWxhYmxlIGJhbGFuY2UgdmFsdWUgb2YgJiN4NjA7bnVsbCYjeDYwOy5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHZhcmlvdXMgYWNjb3VudCBob2xkZXIgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGluY2x1ZGluZyBuYW1lcywgZW1haWxzLCBwaG9uZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eUdldChwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdH0gcHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEludmVzdG1lbnQgSG9sZGluZ3NcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGEgcHJvY2Vzc29yIHRva2VuIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0KHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgU3RyaXBlIGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIFRvIHJldm9rZSB0aGUgcHJvY2Vzc29yXFwncyBhY2Nlc3MsIHRoZSBlbnRpcmUgSXRlbSBtdXN0IGJlIGRlbGV0ZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9ucy4gVGhlIGBwcm9kdWN0c2AgZmllbGQgd2lsbCBiZSBhbiBlbXB0eSBsaXN0IGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFjY2VzcyBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBDb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhIHByb2Nlc3NvciB0b2tlblxcJ3Mgd2ViaG9vayBVUkxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IENoZWNrIGEgdXNlclxcJ3MgUGxhaWQgTmV0d29yayBzdGF0dXNcbiAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rKHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGUoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIHVwZGF0ZSBmb3IgY2FzaGZsb3cgdXBkYXRlcyAoTW9uaXRvcmluZykgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2hmbG93IFVwZGF0ZXNcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0fSBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhbiBJbmNvbWUgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IGlzIHVzZWQgdG8gdGVzdCB0aGF0IGNvZGUgY29ycmVjdGx5IGhhbmRsZXMgd2ViaG9va3MuIFRoaXMgZW5kcG9pbnQgY2FuIHRyaWdnZXIgdGhlIGZvbGxvd2luZyB3ZWJob29rczogIGBERUZBVUxUX1VQREFURWA6IFdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtIHNpbXVsYXRpbmcgYSBkZWZhdWx0IHVwZGF0ZSBldmVudCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvZHVjdCBhcyBzcGVjaWZpZWQgd2l0aCB0aGUgYHdlYmhvb2tfdHlwZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gVmFsaWQgU2FuZGJveCBgREVGQVVMVF9VUERBVEVgIHdlYmhvb2sgdHlwZXMgaW5jbHVkZTogYEFVVEhgLCBgSURFTlRJVFlgLCBgVFJBTlNBQ1RJT05TYCwgYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2AsIGBMSUFCSUxJVElFU2AsIGBIT0xESU5HU2AuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb2R1Y3QsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgTkVXX0FDQ09VTlRTX0FWQUlMQUJMRWA6IEZpcmVkIHRvIGluZGljYXRlIHRoYXQgYSBuZXcgYWNjb3VudCBpcyBhdmFpbGFibGUgb24gdGhlIEl0ZW0gYW5kIHlvdSBjYW4gbGF1bmNoIHVwZGF0ZSBtb2RlIHRvIHJlcXVlc3QgYWNjZXNzIHRvIGl0LiAgYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmA6IEZpcmVkIHdoZW4gYSBnaXZlbiBzYW1lIGRheSBtaWNyby1kZXBvc2l0IGl0ZW0gaXMgdmVyaWZpZWQgdmlhIFNNUyB2ZXJpZmljYXRpb24uICBgTE9HSU5fUkVQQUlSRURgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gcmVjb3ZlcnMgZnJvbSB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHdpdGhvdXQgdGhlIHVzZXIgZ29pbmcgdGhyb3VnaCB1cGRhdGUgbW9kZSBpbiB5b3VyIGFwcC4gIGBQRU5ESU5HX0RJU0NPTk5FQ1RgOiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2lsbCBzdG9wIHdvcmtpbmcgaW4gdGhlIG5lYXIgZnV0dXJlIChlLmcuIGR1ZSB0byBhIHBsYW5uZWQgYmFuayBtaWdyYXRpb24pIGFuZCBtdXN0IGJlIHNlbnQgdGhyb3VnaCB1cGRhdGUgbW9kZSB0byBjb250aW51ZSB3b3JraW5nLiAgIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWA6IFJlY3VycmluZyBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYDogVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiAgSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgUFJPRFVDVF9SRUFEWWA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYSBnaXZlbiBhc3NldCByZXBvcnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgRVJST1JgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGFzc2V0IHJlcG9ydCBnZW5lcmF0aW9uIGhhcyBmYWlsZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFVTRVJfUEVSTUlTU0lPTl9SRVZPS0VEYDogSW5kaWNhdGVzIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhleSBwcmV2aW91c2x5IGdyYW50ZWQgdG8gYWNjZXNzIGFuIEl0ZW0uIE1heSBub3QgYWx3YXlzIGZpcmUgdXBvbiByZXZvY2F0aW9uLCBhcyBzb21lIGluc3RpdHV0aW9uc+KAmSBjb25zZW50IHBvcnRhbHMgZG8gbm90IHRyaWdnZXIgdGhpcyB3ZWJob29rLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgb3IgSXRlbS4gIGBVU0VSX0FDQ09VTlRfUkVWT0tFRGA6IEZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIENoYXNlIGFuZCBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgb3IgSXRlbS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGlzIHByb3ZpZGVkIGZvciBkZXZlbG9wZXIgZWFzZS1vZi11c2UgYW5kIGlzIG5vdCByZXF1aXJlZCBmb3IgdGVzdGluZyB3ZWJob29rczsgd2ViaG9va3Mgd2lsbCBhbHNvIGZpcmUgaW4gU2FuZGJveCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIHRoYXQgdGhleSB3b3VsZCBpbiBQcm9kdWN0aW9uIChleGNlcHQgZm9yIHdlYmhvb2tzIG9mIHR5cGUgYFRSQU5TRkVSYCkuXG4gICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhbiBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSB0aGUgSXRlbSB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBJdGVtIGluIGluIHRoZSBTYW5kYm94IGluIG9yZGVyIHRvIHNpbXVsYXRlIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBmbG93LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGVzdGluZyBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgaW4gU2FuZGJveCwgc2VlIFtBdXRoIGZ1bGwgY292ZXJhZ2UgdGVzdGluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcjKS5cbiAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlIHRoZSBzZWxlY3RlZCBhY2NvdW50cyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIFBsYXR5cHVzIE9hdXRoIGluc3RpdHV0aW9uXG4gICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBwYXJhbSB7U2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0fSBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICogQHN1bW1hcnkgUmVzZXQgdGhlIGxvZ2luIG9mIGEgUGF5bWVudCBQcm9maWxlXG4gICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIHZhcmlvdXMgcGF5bWVudCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFRoaXMgZW5kcG9pbnQgd2lsbCB0cmlnZ2VyIHRoZSBjb3JyZXNwb25kaW5nIHBheW1lbnQgc3RhdHVzIHdlYmhvb2suXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBwYXltZW50IGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW0gYW5kIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlKHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgVHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNyZWF0aW5nIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svZ2V0YCBlbmRwb2ludCB0byBnZXQgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHRlc3QgY2xvY2tzXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luL2AgZnVuY3Rpb25zIHRoZSBzYW1lIGFzIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgYnV0IHdpbGwgbW9kaWZ5IEl0ZW1zIHJlbGF0ZWQgdG8gYSBVc2VyLiBUaGlzIGVuZHBvaW50IGZvcmNlcyBlYWNoIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBhIGdvb2Qgc3RhdGUuIEFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBlbmRwb2ludCwgaWYgb25lIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBJbiB0aGUgU2FuZGJveCwgSXRlbXMgd2lsbCB0cmFuc2l0aW9uIHRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBlcnJvciBzdGF0ZSBhdXRvbWF0aWNhbGx5IGFmdGVyIDMwIGRheXMsIGV2ZW4gaWYgdGhpcyBlbmRwb2ludCBpcyBub3QgY2FsbGVkLlxuICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hVc2VyUmVzZXRMb2dpbihzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IEV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIFNpZ25hbCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBTaWduYWwgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICogQHBhcmFtIHtTaWduYWxQcmVwYXJlUmVxdWVzdH0gc2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0OiBTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGAvc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9zaWduYWwvZXZhbHVhdGVgIGVuZHBvaW50LiBZb3VyIGZlZWRiYWNrIHdpbGwgYmUgdXNlZCBieSB0aGUgbW9kZWwgdG8gaW5jb3Jwb3JhdGUgdGhlIGxhdGVzdCByaXNrIHRyZW5kIGluIHlvdXIgcG9ydGZvbGlvLlxuICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0fSBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgc3RhdGVtZW50cyBhc3NvY2lhdGVkIHdpdGggYW4gaXRlbS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNMaXN0UmVxdWVzdH0gc3RhdGVtZW50c0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c0xpc3Qoc3RhdGVtZW50c0xpc3RSZXF1ZXN0OiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHN0YXRlbWVudHMgZGF0YS5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGdlbmVyYXRlZCBieSB5b3VyIG93biBiYW5raW5nIHByb2R1Y3RzIG9yIHJldHJpZXZlZCBmcm9tIG90aGVyIG5vbi1QbGFpZCBzb3VyY2VzLlxuICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VucmljaCh0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRoZSBJdGVtIHdhcyBsYXN0IHVwZGF0ZWQsIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgIFdoZW4gdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgZm9yIGJlc3QgcmVzdWx0cywgbWFrZSBzdXJlIHRvIHVzZSB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBwYXJhbWV0ZXIgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIEl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhlIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIEl0ZW0uIFRoZSBJdGVtIG11c3QgYWxyZWFkeSBoYXZlIFRyYW5zYWN0aW9ucyBhZGRlZCBhcyBhIHByb2R1Y3QgaW4gb3JkZXIgdG8gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYC4gIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCBhbmQgYC90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gb3B0aW9uYWwgYWRkLW9uIHRvIFRyYW5zYWN0aW9ucyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yaXphdGlvbiBydWxlcy4gIFJ1bGVzIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgSXRlbVxcJ3MgdHJhbnNhY3Rpb25zIHJldHVybmVkIGluIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVzcG9uc2UuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS4gVG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgdHJhbnNhY3Rpb25zLWZlZWRiYWNrQHBsYWlkLmNvbS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IFJldHVybiBhIGxpc3Qgb2YgcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byByZW1vdmUgYSB0cmFuc2FjdGlvbiBydWxlLlxuICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSB0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1N5bmModHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAqIEBzdW1tYXJ5IE9idGFpbiB1c2VyIGluc2lnaHRzIGJhc2VkIG9uIHRyYW5zYWN0aW9ucyBzZW50IHRocm91Z2ggL3RyYW5zYWN0aW9ucy9lbnJpY2hcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gVGhlIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gd2lsbCBleHBpcmUgaWYgbm90IHVzZWQgYWZ0ZXIgb25lIGhvdXIuIChZb3UgY2FuIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1dGhvcml6YXRpb24gbGlmZXRpbWUuKSAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgaXMgbmVlZGVkLCB1c3VhbGx5IHRvIGZpeCBhIGJyb2tlbiBiYW5rIGNvbm5lY3Rpb24sIGJlZm9yZSBQbGFpZCBjYW4gcHJvcGVybHkgYXNzZXNzIHRoZSByaXNrLiBZb3UgbmVlZCB0byBsYXVuY2ggTGluayBpbiB1cGRhdGUgbW9kZSB0byBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgdXNlciBhY3Rpb24uIFdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCB0byBnZXQgYSBuZXcgTGluayB0b2tlbiwgaW5zdGVhZCBvZiBwcm92aWRpbmcgYGFjY2Vzc190b2tlbmAgaW4gdGhlIHJlcXVlc3QsIHlvdSBzaG91bGQgc2V0IFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgYXMgdGhlIGBhdXRob3JpemF0aW9uLmlkYC4gQWZ0ZXIgdGhlIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbi4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGdldCBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIG9mIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChEZXByZWNhdGVkKSBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3R9IHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25zLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNyZWF0ZSh0cmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAqIEBzdW1tYXJ5IFVwbG9hZCB0cmFuc2ZlciBkaWxpZ2VuY2UgZG9jdW1lbnQgb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YCBlbmRwb2ludCB0byBzdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvciAoaS5lLiwgdGhlIGVuZCBjdXN0b21lcikuXG4gICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3R9IHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgLiBPbmUgb2YgYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAgbXVzdCBiZSBwb3B1bGF0ZWQgYnV0IG5vdCBib3RoLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYCBlbmRwb2ludCB0byBnZW5lcmF0ZSBhIHRyYW5zZmVyIGludGVudCBvYmplY3QgYW5kIGludm9rZSB0aGUgVHJhbnNmZXIgVUkuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdDogVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudEdldFJlcXVlc3R9IHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdDogVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9yc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBvbiB0aGUgbGVkZ2VyIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAqIEBzdW1tYXJ5IFdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlckxpc3RSZXF1ZXN0fSB0cmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gVGhpcyBlbmRwb2ludCBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gYWRkaW5nIGFuIEl0ZW0gZm9yIHVzZSB3aXRoIHdpcmUgdHJhbnNmZXJzOyBpZiB5b3UgaW50ZW5kIHRvIGNyZWF0ZSB3aXJlIHRyYW5zZmVycyBvbiB0aGlzIGFjY291bnQsIHlvdSBtdXN0IHByb3ZpZGUgYHdpcmVfcm91dGluZ19udW1iZXJgLiBOb3RlIHRoYXQgSXRlbXMgY3JlYXRlZCBpbiB0aGlzIHdheSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlbmRwb2ludHMgZm9yIG90aGVyIHByb2R1Y3RzLCBzdWNoIGFzIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCBhbmQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgb3JpZ2luYXRvciBhbmQgcmV0dXJuIGFuIGBvcmlnaW5hdG9yX2NsaWVudF9pZGAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZyBwcm9jZXNzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgVHJhbnNmZXIgcGFnZSBvbiB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgc3RhdHVzIG9mIGFsbCBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCBhbGxvd3MgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHNwZWNpZmljIHRvIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIGxlZ2FsIHRlcm1zIHJlcXVpcmVkIGJlZm9yZSBhY2NlcHRpbmcgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gb3JpZ2luYXRvciBmb3Igc2NhbGVkIHBsYXRmb3JtIGN1c3RvbWVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBlcnNvbiByZWNvcmQgYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3IgYW5kIG9wdGlvbmFsbHkgc3VibWl0IHBlcnNvbi1zcGVjaWZpYyByZXF1aXJlbWVudHMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGAgZW5kcG9pbnQgYWxsb3dzIHBsYXRmb3JtcyB0byBzdWJtaXQgb25ib2FyZGluZyByZXF1aXJlbWVudHMgZm9yIGFuIG9yaWdpbmF0b3IgYXMgcGFydCBvZiB0aGUgU2NhbGVkIFBsYXRmb3JtIFRyYW5zZmVyIG9mZmVyaW5nLlxuICAgICAqIEBzdW1tYXJ5IFN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgU2NhbGVkIFBsYXRmb3JtIG9yaWdpbmF0b3JzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlKHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdMaXN0KHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHJlZnVuZC4gIEEgcmVmdW5kIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSByZWZ1bmQgZm9yIGEgdHJhbnNmZXIuIEEgdHJhbnNmZXIgY2FuIGJlIHJlZnVuZGVkIGlmIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIGluIHRoZSBwYXN0IDE4MCBkYXlzLiAgUmVmdW5kcyBjb21lIG91dCBvZiB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb2YgdGhlIGxlZGdlciB1c2VkIGZvciB0aGUgb3JpZ2luYWwgZGViaXQgdHJhbnNmZXIuIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGZ1bmRzIGluIHRoZSBhdmFpbGFibGUgYmFsYW5jZSB0byBjb3ZlciB0aGUgcmVmdW5kIGFtb3VudCwgdGhlIHJlZnVuZCB3aWxsIGJlIHJlamVjdGVkLiBZb3UgY2FuIGNyZWF0ZSBhIHJlZnVuZCBhdCBhbnkgdGltZS4gUGxhaWQgZG9lcyBub3QgaW1wb3NlIGFueSBob2xkIHRpbWUgb24gcmVmdW5kcy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgIGVuZHBvaW50IGZldGNoZXMgcmVwYXltZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy4gUmVwYXltZW50cyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyIChtb3N0IHJlY2VudCBmaXJzdCkgc3RhcnRpbmcgYXQgdGhlIGdpdmVuIGBzdGFydF90aW1lYC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0cyBoaXN0b3JpY2FsIHJlcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFVzZXIgQWNjb3VudFxuICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0OiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIENoZWNrIG9yIEluY29tZSBmbG93LCBvciBhIE11bHRpLUl0ZW0gTGluayBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBUaGUgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdDogVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXIgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICogQHBhcmFtIHtVc2VySXRlbXNHZXRSZXF1ZXN0fSB1c2VySXRlbXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckl0ZW1zR2V0KHVzZXJJdGVtc0dldFJlcXVlc3Q6IFVzZXJJdGVtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC91c2VyL3JlbW92ZWAgZGVsZXRlcyBhIHVzZXIgdG9rZW4gYW5kIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9rZW4uICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHVzZXIgZG9lcyBub3QgZXhpc3QuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJSZW1vdmVSZXF1ZXN0fSB1c2VyUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIFRoaXMgdG9rZW4gY2FuIGJlIHNoYXJlZCB3aXRoIGFuZCB1c2VkIGJ5IGEgc3BlY2lmaWVkIHRoaXJkLXBhcnR5IGNsaWVudCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdGhyb3VnaCBzdXBwb3J0ZWQgZW5kcG9pbnRzLiAgRW5zdXJlIHlvdSBzdG9yZSB0aGUgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gIGFsb25nIHdpdGggdGhlIGB1c2VyX3Rva2VuYCBhbmQgYHRoaXJkX3BhcnR5X2NsaWVudF9pZGAsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gZG9lcyBub3QgZXhpc3QuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBlbmFibGUgYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gIGZvciB1c2Ugd2l0aCBDb25zdW1lciBSZXBvcnRzIGJ5IFBsYWlkIENoZWNrLCBieSBhZGRpbmcgYSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCB0byB0aGUgdXNlci4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaXMgdGhlIG5ld2x5IGNyZWF0ZWQgZS13YWxsZXQgb2JqZWN0LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0R2V0UmVxdWVzdH0gd2FsbGV0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHNwZWNpZmljIGUtd2FsbGV0IHRyYW5zYWN0aW9uXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiBkZXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBgY3JlYXRlZF9hdGAgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgcHJvZ3JhbS4gSWYgeW91ciBhc3NvY2lhdGVkIHByb2dyYW0gaGFzIG9uZ29pbmcgc2NyZWVuaW5nIGVuYWJsZWQsIHRoaXMgaXMgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gbW9uaXRvciB5b3VyIGN1c3RvbWVyIG92ZXIgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlci4gSWYgdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcgaGFzIG5vdCBiZWVuIGVkaXRlZCwgbm8gaGlzdG9yeSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gZW50aXR5IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGEgc3BlY2lmaWMgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGFkZCBhZGRpdGlvbmFsIGN1c3RvbWVyIGluZm9ybWF0aW9uLCBjb3JyZWN0IG91dGRhdGVkIGluZm9ybWF0aW9uLCBhZGQgYSByZWZlcmVuY2UgaWQsIGFzc2lnbiB0aGUgaW5kaXZpZHVhbCB0byBhIHJldmlld2VyLCBhbmQgdXBkYXRlIHdoaWNoIHByb2dyYW0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBtYXkgbm90IHVwZGF0ZSBgc2VhcmNoX3Rlcm1zYCBhbmQgYHN0YXR1c2AgYXQgdGhlIHNhbWUgdGltZSBzaW5jZSBlZGl0aW5nIGBzZWFyY2hfdGVybXNgIG1heSB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBgc3RhdHVzYCBjaGFuZ2UuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgd2ViaG9vayB2ZXJpZmljYXRpb24ga2V5XG4gICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cbn1cblxuXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUgsa0RBQWlFO0FBQ2pFLHlEQUF5RDtBQUN6RCxhQUFhO0FBQ2IscUNBQTROO0FBQzVOLGFBQWE7QUFDYixpQ0FBNEY7QUFFNUY7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBS25CO0FBa0NEOzs7TUFHTTtBQUNOLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN0Qiw2REFBMkMsQ0FBQTtJQUMzQyxzQ0FBb0IsQ0FBQTtJQUNwQiw4Q0FBNEIsQ0FBQTtJQUM1QixxQ0FBbUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFLekI7QUFtSUQ7OztNQUdNO0FBQ04sSUFBWSxtQ0FRWDtBQVJELFdBQVksbUNBQW1DO0lBQzNDLHVGQUFnRCxDQUFBO0lBQ2hELHNHQUErRCxDQUFBO0lBQy9ELGdHQUF5RCxDQUFBO0lBQ3pELDZFQUFzQyxDQUFBO0lBQ3RDLG1GQUE0QyxDQUFBO0lBQzVDLGlGQUEwQyxDQUFBO0lBQzFDLDJFQUFvQyxDQUFBO0FBQ3hDLENBQUMsRUFSVyxtQ0FBbUMsR0FBbkMsMkNBQW1DLEtBQW5DLDJDQUFtQyxRQVE5QztBQXVIRDs7O01BR007QUFDTixJQUFZLGlDQVdYO0FBWEQsV0FBWSxpQ0FBaUM7SUFDekMscUZBQWdELENBQUE7SUFDaEQsb0dBQStELENBQUE7SUFDL0QsOEZBQXlELENBQUE7SUFDekQsMkVBQXNDLENBQUE7SUFDdEMs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O1FBQ3pJLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2TCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQXA5R0QsNEJBbzlHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjYxNy4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbQUNIIFNFQyBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9jcmVhdGluZy10cmFuc2ZlcnMvI2FjaC1zZWMtY29kZXMpLiAgQ29kZXMgc3VwcG9ydGVkIGZvciBjcmVkaXRzOiBgY2NkYCwgYHBwZGAgQ29kZXMgc3VwcG9ydGVkIGZvciBkZWJpdHM6IGBjY2RgLCBgdGVsYCwgYHdlYmAgIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGUuZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUNIQ2xhc3Mge1xuICAgIENjZCA9ICdjY2QnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFRlbCA9ICd0ZWwnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEFQUiBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQVBSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICAvKipcbiAgICAgKiBBbm51YWwgUGVyY2VudGFnZSBSYXRlIGFwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0byB3aGljaCB0aGUgQVBSIGFwcGxpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3R5cGU6IEFQUkFwclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSB0aGF0IGlzIHN1YmplY3RlZCB0byB0aGUgQVBSIGlmIGEgYmFsYW5jZSB3YXMgY2FycmllZCBiZXlvbmQgcGF5bWVudCBkdWUgZGF0ZS4gSG93IGl0IGlzIGNhbGN1bGF0ZWQgY2FuIHZhcnkgYnkgY2FyZCBpc3N1ZXIuIEl0IGlzIG9mdGVuIGNhbGN1bGF0ZWQgYXMgYW4gYXZlcmFnZSBkYWlseSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGJhbGFuY2Vfc3ViamVjdF90b19hcHI6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IGNoYXJnZWQgZHVlIHRvIGludGVyZXN0IGZyb20gbGFzdCBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2hhcmdlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBUFJBcHJUeXBlRW51bSB7XG4gICAgQmFsYW5jZVRyYW5zZmVyQXByID0gJ2JhbGFuY2VfdHJhbnNmZXJfYXByJyxcbiAgICBDYXNoQXByID0gJ2Nhc2hfYXByJyxcbiAgICBQdXJjaGFzZUFwciA9ICdwdXJjaGFzZV9hcHInLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCdcbn1cblxuLyoqXG4gKiBBbGxvdyBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBieSBhY2NvdW50LiBVbmxpc3RlZCAoZS5nLiBtaXNzaW5nKSBhY2NvdW50cyB3aWxsIGJlIGNvbnNpZGVyZWQgYG5ld19hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMgIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRBc3NldHMge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gTm90ZTogRGF0YWJhc2UgTWF0Y2ggaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBpcyBjdXJyZW50bHkgYW4gb3B0LWluIGZpZWxkIGFuZCBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogQXNzZXRSZXBvcnRJbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLkZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlPzogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEFzc2V0c1ZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiBTaW1pbGFyIHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpcyB0eXBpY2FsbHkgZXhwZWN0ZWQsIHdoaWxlIGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSBhY2NvdW50IGF0IGEgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgZWl0aGVyIHRoZSBhY2NvdW504oCZcyBkaXNwbGF5ZWQgbWFzayBvciB0aGUgYWNjb3VudOKAmXMgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW3igJlzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3MnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzV2l0aENhdXRpb24gPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb24nLFxuICAgIERhdGFiYXNlSW5zaWdodHNGYWlsID0gJ2RhdGFiYXNlX2luc2lnaHRzX2ZhaWwnXG59XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgZm9yIHRoZSB1c2VyIHRvIGJlIGFibGUgdG8gc2VsZWN0IGZyb20uIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gUGxhaWQgZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50IGZpbHRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBgYWNjb3VudF9maWx0ZXJzYCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBhY2NvdW50XFwncyBjYXRlZ29yaXphdGlvbiBhcyBlaXRoZXIgYSBwZXJzb25hbCBvciBhIGJ1c2luZXNzIGFjY291bnQuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IGluIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEhvbGRlckNhdGVnb3J5IHtcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgUGVyc29uYWwgPSAncGVyc29uYWwnLFxuICAgIFVucmVjb2duaXplZCA9ICd1bnJlY29nbml6ZWQnXG59XG5cbi8qKlxuICogSWRlbnRpdHkgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGVpdGhlciB0aGUgYWNjb3VudOKAmXMgZGlzcGxheWVkIG1hc2sgb3IgdGhlIGFjY291bnTigJlzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVt4oCZcyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRIb2xkZXJDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBJZGVudGl0eSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnTigJlzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW504oCZcyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbeKAmXMgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIG1pY3JvLWRlcG9zaXRzIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3NgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzdHJvbmcgc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbmA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNvbWUgc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogIFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNpZ25hbCBmb3IgYmVpbmcgaW52YWxpZCBhbmQvb3IgaGF2ZSBubyBzaWduYWwgZm9yIGJlaW5nIHZhbGlkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEluc2lnaHRzLiBOb3RlOiBEYXRhYmFzZSBJbnNpZ2h0cyBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UgYW5kIFBOQykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgbWF5IGJlIHBvcHVsYXRlZCBmb3IgYW55IGFjY291bnQ7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSB1cGxvYWRlZCBhcyBwcm9vZiBvZiBhY2NvdW50IG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD4gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSB1cGxvYWRlZCBhcyBwcm9vZiBvZiBhY2NvdW50IG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkQWxsT2ZcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxJZGVudGl0eURvY3VtZW50VXBsb2FkPiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aXR5IG1hdGNoIHNjb3JlcyBmb3IgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnTigJlzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW504oCZcyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbeKAmXMgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBob2xkZXJfY2F0ZWdvcnk/OiBBY2NvdW50SG9sZGVyQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IFBob25lTnVtYmVyTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtYWlsQWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBQaG9uZU51bWJlck1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbWFpbEFkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHNwZWNpZmljIHByb2R1Y3RzIG9uIHRoaXMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYWNjb3VudCBkYXRhLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2RhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGJhbmsgc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgdGF4X2RvY3VtZW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCBhY2NvdW50cyBiZSBsaW1pdGVkIHRvIGEgc3BlY2lmaWMgY2FyZGluYWxpdHkuIGBNVUxUSV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG11bHRpcGxlIGFjY291bnRzLiBgU0lOR0xFX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgb25seSBhIHNpbmdsZSBhY2NvdW50LiBgQUxMYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgbXVzdCBzaGFyZSBhbGwgb2YgdGhlaXIgYWNjb3VudHMgYW5kIHNob3VsZCBub3QgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIGRlLXNlbGVjdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFNlbGVjdGlvbkNhcmRpbmFsaXR5IHtcbiAgICBTaW5nbGVTZWxlY3QgPSAnU0lOR0xFX1NFTEVDVCcsXG4gICAgTXVsdGlTZWxlY3QgPSAnTVVMVElfU0VMRUNUJyxcbiAgICBBbGwgPSAnQUxMJ1xufVxuXG4vKipcbiAqIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgQ2FzaE1hbmFnZW1lbnQgPSAnY2FzaCBtYW5hZ2VtZW50JyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIENyZWRpdENhcmQgPSAnY3JlZGl0IGNhcmQnLFxuICAgIENyeXB0b0V4Y2hhbmdlID0gJ2NyeXB0byBleGNoYW5nZScsXG4gICAgRWJ0ID0gJ2VidCcsXG4gICAgRWR1Y2F0aW9uU2F2aW5nc0FjY291bnQgPSAnZWR1Y2F0aW9uIHNhdmluZ3MgYWNjb3VudCcsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIExyaWYgPSAnbHJpZicsXG4gICAgTHJzcCA9ICdscnNwJyxcbiAgICBNb25leU1hcmtldCA9ICdtb25leSBtYXJrZXQnLFxuICAgIE1vcnRnYWdlID0gJ21vcnRnYWdlJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBOb25DdXN0b2RpYWxXYWxsZXQgPSAnbm9uLWN1c3RvZGlhbCB3YWxsZXQnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJJbnN1cmFuY2UgPSAnb3RoZXIgaW5zdXJhbmNlJyxcbiAgICBPdGhlckFubnVpdHkgPSAnb3RoZXIgYW5udWl0eScsXG4gICAgT3ZlcmRyYWZ0ID0gJ292ZXJkcmFmdCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBQZW5zaW9uID0gJ3BlbnNpb24nLFxuICAgIFByZXBhaWQgPSAncHJlcGFpZCcsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZHNwID0gJ3Jkc3AnLFxuICAgIFJlc3AgPSAncmVzcCcsXG4gICAgUmV0aXJlbWVudCA9ICdyZXRpcmVtZW50JyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScmlmID0gJ3JyaWYnLFxuICAgIFJyc3AgPSAncnJzcCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgU2F2aW5ncyA9ICdzYXZpbmdzJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFN0dWRlbnQgPSAnc3R1ZGVudCcsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5J1xufVxuXG4vKipcbiAqIGBpbnZlc3RtZW50OmAgSW52ZXN0bWVudCBhY2NvdW50LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyB0eXBlIGlzIGNhbGxlZCBgYnJva2VyYWdlYCBpbnN0ZWFkLiAgYGNyZWRpdDpgIENyZWRpdCBjYXJkICBgZGVwb3NpdG9yeTpgIERlcG9zaXRvcnkgYWNjb3VudCAgYGxvYW46YCBMb2FuIGFjY291bnQgIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRUeXBlIHtcbiAgICBJbnZlc3RtZW50ID0gJ2ludmVzdG1lbnQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBmcm9tIHBlcmZvcm1pbmcgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGZvciB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgbmV0d29ya19zdGF0dXM6IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJuc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgcHJldmlvdXNfcmV0dXJucz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzQWNjb3VudE51bWJlckZvcm1hdH1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfZm9ybWF0OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0O1xufVxuLyoqXG4gKiBJbmRpY2F0b3Igb2YgYWNjb3VudCBudW1iZXIgZm9ybWF0IHZhbGlkaXR5IGZvciBpbnN0aXR1dGlvbi4gIGB2YWxpZGA6IGluZGljYXRlcyB0aGF0IHRoZSBhY2NvdW50IG51bWJlciBoYXMgYSBjb3JyZWN0IGZvcm1hdCBmb3IgdGhlIGluc3RpdHV0aW9uLiAgYGludmFsaWRgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgYWNjb3VudCBudW1iZXIgaGFzIGFuIGluY29ycmVjdCBmb3JtYXQgZm9yIHRoZSBpbnN0aXR1dGlvbi4gIGB1bmtub3duYDogaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvcm1hdCBpcyBjb3JyZWN0IGZvciB0aGUgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0IHtcbiAgICBWYWxpZCA9ICd2YWxpZCcsXG4gICAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbi8qKlxuICogU3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciBpbiB0aGUgUGxhaWQgbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBhY2NvdW50IGZvciB0aGUgQUNIIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzXG4gICAgICovXG4gICAgaGFzX251bWJlcnNfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBhY2NvdW50IGZvciB0aGUgQUNIIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyIGlzIGFscmVhZHkgdmVyaWZpZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXNcbiAgICAgKi9cbiAgICBpc19udW1iZXJzX21hdGNoX3ZlcmlmaWVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBrbm93biBBQ0ggcmV0dXJucyBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgaW5jbHVkZSBhIGtub3duIGFkbWluaXN0cmF0aXZlIEFDSCByZXR1cm4gZm9yIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAgICAgKi9cbiAgICBoYXNfcHJldmlvdXNfYWRtaW5pc3RyYXRpdmVfcmV0dXJuOiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2RldGFpbHM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCAqYW5kKiBvbmUgb3IgbW9yZSBhY2NvdW50IHR5cGVzIGJlaW5nIHJlcXVlc3RlZCBpcyBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgKHN1Y2ggYXMgYSBjcmVkaXQgY2FyZCkgYXMgQ2FwaXRhbCBPbmUgZG9lcyBub3QgcHJvdmlkZSByZWFsLXRpbWUgYmFsYW5jZSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIEluIHRoaXMgY2FzZSwgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCBhcyB3ZWxsIGFzIGZvciBkZXBvc2l0b3J5IGFjY291bnRzIGF0IENhcGl0YWwgT25lIChpbmNsdWRpbmcgYWxsIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzKSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQgYW5kIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uIHdpbGwgYmUgZmV0Y2hlZC4gIElmIHRoaXMgZmllbGQgaXMgbm90IGlnbm9yZWQsIGFuZCBubyBhY2NlcHRhYmxlIGJhbGFuY2UgaXMgYXZhaWxhYmxlLCBhbiBgSU5WQUxJRF9SRVNVTFRgIGVycm9yIHdpdGggdGhlIGNvZGUgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUbyBlbmFibGUgQmFsYW5jZSBQbHVzIChiZXRhKSwgc2VuZCB0aGlzIG9iamVjdCBhcyBwYXJ0IG9mIHRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXF1ZXN0LiBPbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgcGFydGljaXBhdGluZyBpbiB0aGUgQmFsYW5jZSBQbHVzIGJldGEgcHJvZ3JhbTsgdG8gZW5yb2xsIGluIHRoZSBiZXRhLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBJZiB0aGlzIG9iamVjdCBpcyBwcmVzZW50IGluIHRoZSByZXF1ZXN0LCB0aGUgW2BwYXltZW50X3Jpc2tfYXNzZXNzbWVudGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS9iYWxhbmNlLXBsdXMvI2FjY291bnRzLWJhbGFuY2UtZ2V0LXJlc3BvbnNlLXBheW1lbnQtcmlzay1hc3Nlc3NtZW50LXJpc2stbGV2ZWwpIG9iamVjdCB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgdGhhdCBpcyB0aGUgZnVuZGluZyBzb3VyY2UgZm9yIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbi4gVGhlIGBhY2NvdW50X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGFzIHdlbGwgYXMgdGhlIFtgb25TdWNjZXNzYF0oL2RvY3MvbGluay9pb3MvI2xpbmstaW9zLW9uc3VjY2Vzcy1saW5rU3VjY2Vzcy1tZXRhZGF0YS1hY2NvdW50cy1pZCkgY2FsbGJhY2sgbWV0YWRhdGEuICBUaGlzIHdpbGwgcmV0dXJuIGFuIFtgSU5WQUxJRF9BQ0NPVU5UX0lEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBgYW1vdW50YCBtdWx0aXBsaWVkIGJ5IHRoZSBgYmFsYW5jZV90aHJlc2hvbGRfcGVyY2VudGFnZWAgKGFzIGEgcGVyY2VudGFnZSkgZXhjZWVkcyB0aGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCwgdGhlbiBbYHBheW1lbnRfcmlza19hc3Nlc3NtZW50LmV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNhY2NvdW50cy1iYWxhbmNlLWdldC1yZXNwb25zZS1wYXltZW50LXJpc2stYXNzZXNzbWVudC1leGNlZWRzLWJhbGFuY2UtdGhyZXNob2xkKSBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZmFsc2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYGFtb3VudGAgaXMgMjAwIGFuZCB0aGUgYGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2VgIGlzIDkwLCB0aGVuIHRoZSBhY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBhdCBsZWFzdCAxODAgZm9yIGBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkYCB0byBiZSBmYWxzZS4gICBCeSBkZWZhdWx0LCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugd2lsbCBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uOyBpZiBpdCBjYW5ub3QgYmUgb2J0YWluZWQsIHRoZSBjdXJyZW50IGJhbGFuY2Ugd2lsbCBiZSB1c2VkLiAgIFRoaXMgZmllbGQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tZXJzIHVzaW5nIGluZGlyZWN0IEl0ZW1zIGFuZCB3aG8gZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byByYXcgYmFsYW5jZSBkYXRhLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2U/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBiYWxhbmNlIGhhcyB0byBiZSByZWZyZXNoZWQgaW4gcmVhbCB0aW1lIGFzIHBhcnQgb2YgdGhlIEFQSSBjYWxsIHdoZW4gdXNpbmcgQmFsYW5jZSBQbHVzLiBTZXR0aW5nIHRoaXMgdG8gZmllbGQgdG8gYHRydWVgIHdpbGwgcmVzdWx0IGluIG1vcmUgcmVjZW50IGJhbGFuY2VzLCBidXQgbGF0ZW5jeSBtYXkgYmUgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlLiBJZiBtYWtpbmcgYSByZWd1bGFyIChub24tQmFsYW5jZSBQbHVzKSBCYWxhbmNlIGNhbGwsIHdpdGhvdXQgdGhlIGBwYXltZW50X2RldGFpbHNgIG9iamVjdCBwcmVzZW50LCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3aWxsIGFsd2F5cyByZXR1cm4gcmVhbC10aW1lIGJhbGFuY2VzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICByZXF1aXJlc19yZWFsX3RpbWVfYmFsYW5jZV9yZWZyZXNoPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvdmlkZXMgYSBkZXRhaWxlZCByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24uIEZvciB0aGlzIGZpZWxkIHRvIGJlIHJldHVybmVkLCB0aGUgY2xpZW50IG11c3QgYmUgZW5yb2xsZWQgaW4gdGhlIEJhbGFuY2UgUGx1cyBiZXRhIHByb2dyYW0gYW5kIHRoZSBbYHBheW1lbnRfZGV0YWlsc2BdKGh0dHA6Ly9wbGFpZC5jb20vZG9jcy9iYWxhbmNlL2JhbGFuY2UtcGx1cy8jYWNjb3VudHMtYmFsYW5jZS1nZXQtcmVxdWVzdC1wYXltZW50LWRldGFpbHMpIG9iamVjdCBtdXN0IGhhdmUgYmVlbiBzZW50IGluIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFsYW5jZVBsdXNSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgcmlza19sZXZlbDogQmFsYW5jZVBsdXNSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbGFuY2VQbHVzQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzOiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogQSByaXNrIHNjb3JlIHJhbmdpbmcgZnJvbSAxLTk5LCByZWZsZWN0aW5nIHRoZSBsaWtlbGlob29kIG9mIEFDSCBkZWJpdCByZXR1cm4uIEEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyBhIGdyZWF0ZXIgcmlzayBvZiByZXR1cm4sIG9mdGVuIGR1ZSB0byBvdmVyZHJhd24gYWNjb3VudHMgb3IgYWNjb3VudCBpbmVsaWdpYmlsaXR5IHRvIHJlY2VpdmUgQUNIIHRyYW5zYWN0aW9ucy4gVHlwaWNhbCByZXR1cm4gY29kZXMgaW5jbHVkZSBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLCBldGMuLCB3aXRoIGEgdHVybmFyb3VuZCBvZiAyIGJhbmtpbmcgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBiYWxhbmNlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgYmFsYW5jZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHJlYXNvbiBjb250cmlidXRpbmcgdG8gdGhlIHJpc2sgYXNzZXNzbWVudCBvZiBhbiBBQ0ggdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBzdXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIGNsYXNzaWZpZWQgYXMgYEhJR0hgLCBgTUVESVVNLUhJR0hgLCBvciBgTUVESVVNYCByaXNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrUmVhc29uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICByaXNrX3JlYXNvbnM/OiBBcnJheTxSaXNrUmVhc29uPjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBleGNlZWRzIHRoZSBiYWxhbmNlIHRocmVzaG9sZCBzZXQgaW4gdGhlIHJlcXVlc3QuIGB0cnVlYCBpbmRpY2F0ZXMgaGlnaGVyIHJpc2s7IGBmYWxzZWAgaW5kaWNhdGVzIGxvd2VyIHJpc2suIElmIHRoZSBgYW1vdW50YCBtdWx0aXBsaWVkIGJ5IHRoZSBgYmFsYW5jZV90aHJlc2hvbGRfcGVyY2VudGFnZWAgKGFzIGEgcGVyY2VudGFnZSkgZXhjZWVkcyB0aGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCwgdGhlbiBgZXhjZWVkc19iYWxhbmNlX3RocmVzaG9sZGAgd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZmFsc2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYGFtb3VudGAgaXMgMjAwIGFuZCB0aGUgYGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2VgIGlzIDkwLCB0aGVuIHRoZSBhY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBhdCBsZWFzdCAxODAgZm9yIGBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkYCB0byBiZSBmYWxzZS4gICBCeSBkZWZhdWx0LCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugd2lsbCBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uOyBpZiBpdCBjYW5ub3QgYmUgb2J0YWluZWQsIHRoZSBjdXJyZW50IGJhbGFuY2Ugd2lsbCBiZSB1c2VkLiAgIFRoaXMgZmllbGQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tZXJzIHVzaW5nIGluZGlyZWN0IEl0ZW1zIGFuZCB3aG8gZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byByYXcgYmFsYW5jZSBkYXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIGV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGQ6IGJvb2xlYW47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGAgYW5kIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSWYgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgd2FzIGNhbGxlZCwgZWFjaCBhY2NvdW50IHdpbGwgaW5jbHVkZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrX2Fzc2Vzc21lbnQ/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aW9uL2FjdGl2aXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWN0aW9uU3RhdGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQXR0ZW1wdCA9ICdBVFRFTVBUJyxcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRScsXG4gICAgU2tpcHBlZCA9ICdTS0lQUEVEJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjdGl2aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpdml0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgYWN0aXZpdHk6IEFjdGl2aXR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGlzIGFjdGl2aXR5IHdhcyBpbml0aWF0ZWQgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpbml0aWF0ZWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY3Rpdml0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcHBsaWNhdGlvbiBJRCBvZiB0aGUgY2xpZW50IHdobyBpbml0aWF0ZWQgdGhlIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjdGlvblN0YXRlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHN0YXRlOiBBY3Rpb25TdGF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgdGFyZ2V0X2FwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBhdXRoZW50aWNhdGlvbj86IEl0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbjtcbn1cbi8qKlxuICogVHlwZXMgb2YgY29uc2VudCBhY3Rpdml0aWVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpdml0eVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgSXRlbUNyZWF0ZSA9ICdJVEVNX0NSRUFURScsXG4gICAgSXRlbUltcG9ydCA9ICdJVEVNX0lNUE9SVCcsXG4gICAgSXRlbVVwZGF0ZSA9ICdJVEVNX1VQREFURScsXG4gICAgSXRlbVVubGluayA9ICdJVEVNX1VOTElOSycsXG4gICAgUG9ydGFsVW5saW5rID0gJ1BPUlRBTF9VTkxJTksnLFxuICAgIFBvcnRhbEl0ZW1zRGVsZXRlID0gJ1BPUlRBTF9JVEVNU19ERUxFVEUnLFxuICAgIEl0ZW1SZW1vdmUgPSAnSVRFTV9SRU1PVkUnLFxuICAgIEludmFyaWFudENoZWNrZXJEZWxldGlvbiA9ICdJTlZBUklBTlRfQ0hFQ0tFUl9ERUxFVElPTicsXG4gICAgU2NvcGVzVXBkYXRlID0gJ1NDT1BFU19VUERBVEUnXG59XG5cbi8qKlxuICogQSBwaHlzaWNhbCBtYWlsaW5nIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTm90UmVxdWlyZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYmVpbmcgdXNlZCBmb3IgY29tbWVyY2lhbCBvciByZXNpZGVudGlhbCBwdXJwb3Nlcy4gIE5vdGU6IFRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAgd2hlbiBQbGFpZCBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3NcXCdzIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFkZHJlc3NQdXJwb3NlTGFiZWwge1xuICAgIFJlc2lkZW50aWFsID0gJ3Jlc2lkZW50aWFsJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBhcHBsaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5IHB1cnBvc2VzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgZ3JhbnRlZCBwcm9kdWN0aW9uIGFjY2VzcyBhdCBQbGFpZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGpvaW5fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgY2xpZW504oCZcyBicm9hZCB1c2UgY2FzZSBhcyBhc3Nlc3NlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHVzZV9jYXNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBjbGllbnTigJlzIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNvbXBhbnlfbGVnYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNpdHkgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlZ2lvbiBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3N0YWwgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFwcGxpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldEhvbGRlck5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXIge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXJzIHtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsdGltZSB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIGBjdXJyZW50YCBpcyBgbnVsbGAgdGhpcyBmaWVsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGFzc2V0cyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IGJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDsgaWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgVHJhbnNhY3Rpb25zLCB0aGUgYmFsYW5jZSB3aWxsIGJlIGF0IGxlYXN0IGFzIHJlY2VudCBhcyB0aGUgbW9zdCByZWNlbnQgVHJhbnNhY3Rpb24gdXBkYXRlLiBJZiB5b3UgcmVxdWlyZSByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGJvcnJvd2VkIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBpbnZlc3RtZW50LXR5cGUgYWNjb3VudHMsIHRoZSBtYXJnaW4gYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYm9ycm93ZWQgYXNzZXRzIGluIHRoZSBhY2NvdW50LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG1hcmdpbiBvciBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIG1hcmdpbl9sb2FuX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRvcl9pZGAgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0b3JfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiBUaGUgYGFzc2V0c2AgcHJvZHVjdCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBsaW5rOyB0aGUgQXNzZXRzIHByb2R1Y3QgY2Fubm90IGJlIGFkZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBJZiB1c2luZyBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eSwgYGRheXNfcmVxdWVzdGVkYCBtdXN0IGJlIGF0IGxlYXN0IDYxIGZvciBuZXcgb3JpZ2luYXRpb25zIG9yIGF0IGxlYXN0IDMxIGZvciByZWZpbmFuY2luZ3MuICBBbiBBc3NldCBSZXBvcnQgcmVxdWVzdGVkIHdpdGggXFxcIkFkZGl0aW9uYWwgSGlzdG9yeVxcXCIgKHRoYXQgaXMsIHdpdGggbW9yZSB0aGFuIDYxIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgd2lsbCBpbmN1ciBhbiBBZGRpdGlvbmFsIEhpc3RvcnkgZmVlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC4gVGhlIG9wdGlvbmFsIGB1c2VyYCBvYmplY3QgaXMgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIEFzc2V0cyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIEFzc2V0IFJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogdHJ1ZSB0byByZXR1cm4gYmFsYW5jZSBhbmQgaWRlbnRpdHkgZWFybGllciBhcyBhIGZhc3QgcmVwb3J0LiBEZWZhdWx0cyB0byBmYWxzZSBpZiBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2Zhc3RfcmVwb3J0PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgYXNzZXQgcmVwb3J0LiBQb3NzaWJsZSB2YWx1ZXM6IGBcXFwiaW52ZXN0bWVudHNcXFwiYFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgQXNzZXQgUmVwb3J0LiBUbyBmZXRjaCBgaW52ZXN0bWVudHNgIGRhdGEgKHRyYW5zYWN0aW9ucywgaG9sZGluZ3MsIGV0Yy4pIGluIHRoZSBBc3NldCBSZXBvcnQsIGBpbnZlc3RtZW50c2AgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYGFkZF9vbnNgLiBGb3IgRmFzdCBBc3NldHMsIGBmYXN0X2Fzc2V0c2AgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYGFkZF9vbnNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEFkZE9ucz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xuICAgIC8qKlxuICAgICAqIElmIHNldCB0byBmYWxzZSwgb25seSAxIGl0ZW0gbXVzdCBiZSBoZWFsdGh5IGF0IHRoZSB0aW1lIG9mIHJlcG9ydCBjcmVhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZSwgd2hpY2ggd291bGQgcmVxdWlyZSBhbGwgaXRlbXMgdG8gYmUgaGVhbHRoeSBhdCB0aGUgdGltZSBvZiByZXBvcnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1aXJlX2FsbF9pdGVtcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGFuIGFzc2V0IHJlcG9ydCBmb3IuIFRoZSBsYXRlc3QgYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB3aWxsIGJlIHJldHVybmVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBmZXRjaCBcXFwiZmFzdFxcXCIgdmVyc2lvbiBvZiBhc3NldCByZXBvcnQuIERlZmF1bHRzIHRvIGZhbHNlIGlmIG9taXR0ZWQuIENhbiBvbmx5IGJlIHVzZWQgaWYgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3YXMgY2FsbGVkIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBmYXN0X3JlcG9ydD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIG9yIGFkZCBkYXRhIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBBc3NldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgaG9sZGluZ3MsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9u4oCZcyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSBmb3IgYnV5IHRyYW5zYWN0aW9uczsgbmVnYXRpdmUgZm9yIHNlbGwgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHZlc3RlZCBob2xkaW5ncyBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHZlc3RlZF92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYW4gQXNzZXQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbeKAmXMgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBc3NldHM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEFzc2V0cz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm5lZCBieSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBNdXN0IGJlIGFuIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYG9wdGlvbnNgIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aWxsIGJlIHVzZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIGFzc2V0IHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgZWl0aGVyIGEgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IGN1cnJlbnQgaWRlbnRpdHkgYW5kIGJhbGFuY2UgaW5mb3JtYXRpb24sIG9yIGEgRnVsbCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgYWxzbyBjb250YWluIGhpc3RvcmljYWwgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgdHJhbnNhY3Rpb24gZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHlwZSB7XG4gICAgRnVsbCA9ICdGVUxMJyxcbiAgICBGYXN0ID0gJ0ZBU1QnXG59XG5cbi8qKlxuICogVGhlIHVzZXIgb2JqZWN0IGFsbG93cyB5b3UgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBBc3NldCBSZXBvcnQuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBUaGUgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYW5kIGBzc25gIGZpZWxkcyBhcmUgcmVxdWlyZWQgaWYgeW91IHdvdWxkIGxpa2UgdGhlIFJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZeKAmXMgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB5b3UgZGV0ZXJtaW5lIGFuZCBzdWJtaXQgZm9yIHRoZSB1c2VyLiBJZiB1c2luZyB0aGUgQ3JlZGl0IERhc2hib2FyZCwgQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL3VzZXIvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZS4gIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gQ2F0ZWdvcnkgVHlwZSBFbnVtZXJhdGVkIGRlcml2ZWQgYnkgVmVuZG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB7XG4gICAgQXRtRmVlID0gJ0FUTUZlZScsXG4gICAgQWR2ZXJ0aXNpbmcgPSAnQWR2ZXJ0aXNpbmcnLFxuICAgIEFpclRyYXZlbCA9ICdBaXJUcmF2ZWwnLFxuICAgIEFsY29ob2xCYXJzID0gJ0FsY29ob2xCYXJzJyxcbiAgICBBbGxvd2FuY2UgPSAnQWxsb3dhbmNlJyxcbiAgICBBbXVzZW1lbnQgPSAnQW11c2VtZW50JyxcbiAgICBBcnRzID0gJ0FydHMnLFxuICAgIEF1dG9UcmFuc3BvcnQgPSAnQXV0b1RyYW5zcG9ydCcsXG4gICAgQXV0b0luc3VyYW5jZSA9ICdBdXRvSW5zdXJhbmNlJyxcbiAgICBBdXRvUGF5bWVudCA9ICdBdXRvUGF5bWVudCcsXG4gICAgQmFieVN1cHBsaWVzID0gJ0JhYnlTdXBwbGllcycsXG4gICAgQmFieXNpdHRlckRheWNhcmUgPSAnQmFieXNpdHRlckRheWNhcmUnLFxuICAgIEJhbmtGZWUgPSAnQmFua0ZlZScsXG4gICAgQmlsbHNVdGlsaXRpZXMgPSAnQmlsbHNVdGlsaXRpZXMnLFxuICAgIEJvbnVzID0gJ0JvbnVzJyxcbiAgICBCb29rc1N1cHBsaWVzID0gJ0Jvb2tzU3VwcGxpZXMnLFxuICAgIEJ1c2luZXNzU2VydmljZXMgPSAnQnVzaW5lc3MgU2VydmljZXMnLFxuICAgIEJ1eSA9ICdCdXknLFxuICAgIENhc2hBdG0gPSAnQ2FzaEFUTScsXG4gICAgQ2hhcml0eSA9ICdDaGFyaXR5JyxcbiAgICBDaGVjayA9ICdDaGVjaycsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NoaWxkU3VwcG9ydCcsXG4gICAgQ2xvdGhpbmcgPSAnQ2xvdGhpbmcnLFxuICAgIENvZmZlZVNob3BzID0gJ0NvZmZlZVNob3BzJyxcbiAgICBDcmVkaXRDYXJkUGF5bWVudCA9ICdDcmVkaXRDYXJkUGF5bWVudCcsXG4gICAgRGVudGlzdCA9ICdEZW50aXN0JyxcbiAgICBEb2N0b3IgPSAnRG9jdG9yJyxcbiAgICBFZHVjYXRpb24gPSAnRWR1Y2F0aW9uJyxcbiAgICBFbGVjdHJvbmljc1NvZnR3YXJlID0gJ0VsZWN0cm9uaWNzU29mdHdhcmUnLFxuICAgIEVudGVydGFpbm1lbnQgPSAnRW50ZXJ0YWlubWVudCcsXG4gICAgRXllY2FyZSA9ICdFeWVjYXJlJyxcbiAgICBGYXN0Rm9vZCA9ICdGYXN0Rm9vZCcsXG4gICAgRmVkZXJhbFRheCA9ICdGZWRlcmFsVGF4JyxcbiAgICBGZWVzQ2hhcmdlcyA9ICdGZWVzQ2hhcmdlcycsXG4gICAgRmluYW5jZUNoYXJnZSA9ICdGaW5hbmNlQ2hhcmdlJyxcbiAgICBGaW5hbmNpYWwgPSAnRmluYW5jaWFsJyxcbiAgICBGaW5hbmNpYWxBZHZpc29yID0gJ0ZpbmFuY2lhbEFkdmlzb3InLFxuICAgIEZvb2REaW5pbmcgPSAnRm9vZERpbmluZycsXG4gICAgRnVybmlzaGluZ3MgPSAnRnVybmlzaGluZ3MnLFxuICAgIEdhc0Z1ZWwgPSAnR2FzRnVlbCcsXG4gICAgR2lmdHNEb25hdGlvbnMgPSAnR2lmdHNEb25hdGlvbnMnLFxuICAgIEdyb2NlcmllcyA9ICdHcm9jZXJpZXMnLFxuICAgIEd5bSA9ICdHeW0nLFxuICAgIEhhaXIgPSAnSGFpcicsXG4gICAgSGVhbHRoRml0bmVzcyA9ICdIZWFsdGhGaXRuZXNzJyxcbiAgICBIZWFsdGhJbnN1cmFuY2UgPSAnSGVhbHRoSW5zdXJhbmNlJyxcbiAgICBIb2JiaWVzID0gJ0hvYmJpZXMnLFxuICAgIEhvbWUgPSAnSG9tZScsXG4gICAgSG9tZUltcHJvdmVtZW50ID0gJ0hvbWVJbXByb3ZlbWVudCcsXG4gICAgSG9tZUluc3VyYW5jZSA9ICdIb21lSW5zdXJhbmNlJyxcbiAgICBIb21lUGhvbmUgPSAnSG9tZVBob25lJyxcbiAgICBIb21lU2VydmljZXMgPSAnSG9tZVNlcnZpY2VzJyxcbiAgICBIb21lU3VwcGxpZXMgPSAnSG9tZVN1cHBsaWVzJyxcbiAgICBIb3RlbCA9ICdIb3RlbCcsXG4gICAgSW5jb21lID0gJ0luY29tZScsXG4gICAgSW50ZXJlc3RJbmNvbWUgPSAnSW50ZXJlc3RJbmNvbWUnLFxuICAgIEludGVybmV0ID0gJ0ludGVybmV0JyxcbiAgICBJbnZlc3RtZW50cyA9ICdJbnZlc3RtZW50cycsXG4gICAgS2lkcyA9ICdLaWRzJyxcbiAgICBLaWRzQWN0aXZpdGllcyA9ICdLaWRzQWN0aXZpdGllcycsXG4gICAgTGF0ZUZlZSA9ICdMYXRlRmVlJyxcbiAgICBMYXVuZHJ5ID0gJ0xhdW5kcnknLFxuICAgIExhd25HYXJkZW4gPSAnTGF3bkdhcmRlbicsXG4gICAgTGVnYWwgPSAnTGVnYWwnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnTGlmZUluc3VyYW5jZScsXG4gICAgTG9hbkluc3VyYW5jZSA9ICdMb2FuSW5zdXJhbmNlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdMb2FuUGF5bWVudCcsXG4gICAgTG9hbnMgPSAnTG9hbnMnLFxuICAgIE1vYmlsZVBob25lID0gJ01vYmlsZVBob25lJyxcbiAgICBNb3J0Z2FnZVJlbnQgPSAnTW9ydGdhZ2VSZW50JyxcbiAgICBNb3ZpZXNEdmRzID0gJ01vdmllc0RWRHMnLFxuICAgIE11c2ljID0gJ011c2ljJyxcbiAgICBOZXdzcGFwZXJzTWFnYXppbmVzID0gJ05ld3NwYXBlcnNNYWdhemluZXMnLFxuICAgIE9mZmljZVN1cHBsaWVzID0gJ09mZmljZVN1cHBsaWVzJyxcbiAgICBQYXJraW5nID0gJ1BhcmtpbmcnLFxuICAgIFBheWNoZWNrID0gJ1BheWNoZWNrJyxcbiAgICBQZXJzb25hbENhcmUgPSAnUGVyc29uYWxDYXJlJyxcbiAgICBQZXRGb29kU3VwcGxpZXMgPSAnUGV0Rm9vZFN1cHBsaWVzJyxcbiAgICBQZXRHcm9vbWluZyA9ICdQZXRHcm9vbWluZycsXG4gICAgUGV0cyA9ICdQZXRzJyxcbiAgICBQaGFybWFjeSA9ICdQaGFybWFjeScsXG4gICAgUHJpbnRpbmcgPSAnUHJpbnRpbmcnLFxuICAgIFByb3BlcnR5VGF4ID0gJ1Byb3BlcnR5IFRheCcsXG4gICAgUHVibGljVHJhbnNwb3J0YXRpb24gPSAnUHVibGljIFRyYW5zcG9ydGF0aW9uJyxcbiAgICBSZWltYnVyc2VtZW50ID0gJ1JlaW1idXJzZW1lbnQnLFxuICAgIFJlbnRhbENhclRheGkgPSAnUmVudGFsQ2FyVGF4aScsXG4gICAgUmVzdGF1cmFudHMgPSAnUmVzdGF1cmFudHMnLFxuICAgIFNhbGVzVGF4ID0gJ1NhbGVzVGF4JyxcbiAgICBTZXJ2aWNlUGFydHMgPSAnU2VydmljZVBhcnRzJyxcbiAgICBTZXJ2aWNlRmVlID0gJ1NlcnZpY2VGZWUnLFxuICAgIFNoaXBwaW5nID0gJ1NoaXBwaW5nJyxcbiAgICBTaG9wcGluZyA9ICdTaG9wcGluZycsXG4gICAgU3BhTWFzc2FnZSA9ICdTcGFNYXNzYWdlJyxcbiAgICBTcG9ydGluZ0dvb2RzID0gJ1Nwb3J0aW5nR29vZHMnLFxuICAgIFNwb3J0cyA9ICdTcG9ydHMnLFxuICAgIFN0YXRlVGF4ID0gJ1N0YXRlVGF4JyxcbiAgICBTdHVkZW50TG9hbiA9ICdTdHVkZW50IExvYW4nLFxuICAgIFRheGVzID0gJ1RheGVzJyxcbiAgICBUZWxldmlzaW9uID0gJ1RlbGV2aXNpb24nLFxuICAgIFRveXMgPSAnVG95cycsXG4gICAgVHJhbnNmZXIgPSAnVHJhbnNmZXInLFxuICAgIFRyYXZlbCA9ICdUcmF2ZWwnLFxuICAgIFR1aXRpb24gPSAnVHVpdGlvbicsXG4gICAgVW5jYXRlZ29yaXplZCA9ICdVbmNhdGVnb3JpemVkJyxcbiAgICBVdGlsaXRpZXMgPSAnVXRpbGl0aWVzJyxcbiAgICBWYWNhdGlvbiA9ICdWYWNhdGlvbicsXG4gICAgVmV0ZXJpbmFyeSA9ICdWZXRlcmluYXJ5J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEZXNjcmlwdGlvbiBTdHJpbmcgdXAgdG8gMyBvY2N1cmFuY2VzIDEgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWwge1xuICAgIC8qKlxuICAgICAqIEEgdmVuZG9yIGNyZWF0ZWQgdW5pcXVlIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25VbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gQW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBQb3N0IERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25Qb3N0RGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlOiBBc3NldFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB3aXRoIHdobyBkaWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUGFpZEJ5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGSSBQcm92aWRlZCAtIGV4YW1wbGVzIGFyZSBhdG0sIGNhc2gsIGNoZWNrLCBjcmVkaXQsIGRlYml0LCBkZXBvc2l0LCBkaXJlY3REZWJpdCwgZGlyZWN0RGVwb3NpdCwgZGl2aWRlbmQsIGZlZSwgaW50ZXJlc3QsIG90aGVyLCBwYXltZW50LCBwb2ludE9mU2FsZSwgcmVwZWF0UGF5bWVudCwgc2VydmljZUNoYXJnZSwgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZTogQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgcHJvdmlkZWQgVHJhbnNhY3Rpb24gSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2FjdGlvbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIFR5cGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQ3JlZGl0ID0gJ0NyZWRpdCcsXG4gICAgRGViaXQgPSAnRGViaXQnXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgZmluYW5jaWFsIGFzc2V0cyBpbiBhIG1vcnRnYWdlIGxvYW4gdHJhbnNhY3Rpb24uIEFzc2V0cyBtYXkgYmUgZWl0aGVyIGxpcXVpZCBvciBmaXhlZCBhbmQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgYXNzZXQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUeXBlIHtcbiAgICBDaGVja2luZ0FjY291bnQgPSAnQ2hlY2tpbmdBY2NvdW50JyxcbiAgICBTYXZpbmdzQWNjb3VudCA9ICdTYXZpbmdzQWNjb3VudCcsXG4gICAgSW52ZXN0bWVudCA9ICdJbnZlc3RtZW50JyxcbiAgICBNb25leU1hcmtldEZ1bmQgPSAnTW9uZXlNYXJrZXRGdW5kJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldD59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxBc3NldD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBBc3NldCBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW914oCZbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgQXNzZXQgUmVwb3J0IHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZT86IEFzc2V0UmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUGxhaWQgd2lsbCB0cmlnZ2VyIGEgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIGZvciBJdGVtcyB0aGF0IHVuZGVyZ28gYSBjaGFuZ2UgaW4gQXV0aCBkYXRhLiBUaGlzIGlzIGdlbmVyYWxseSBjYXVzZWQgYnkgZGF0YSBwYXJ0bmVycyBub3RpZnlpbmcgUGxhaWQgb2YgYSBjaGFuZ2UgaW4gdGhlaXIgYWNjb3VudCBudW1iZXJpbmcgc3lzdGVtIG9yIHRvIHRoZWlyIHJvdXRpbmcgbnVtYmVycy4gVG8gYXZvaWQgcmV0dXJuZWQgdHJhbnNhY3Rpb25zLCBjdXN0b21lcnMgdGhhdCByZWNlaXZlIGEgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHdpdGggdGhlIGBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfYXV0aGAgb2JqZWN0IHBvcHVsYXRlZCBzaG91bGQgaW1tZWRpYXRlbHkgZGlzY29udGludWUgYWxsIHVzYWdlcyBvZiBleGlzdGluZyBBdXRoIGRhdGEgZm9yIHRob3NlIGFjY291bnRzIGFuZCBjYWxsIGAvYXV0aC9nZXRgIG9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCB0byBvYnRhaW4gdXBkYXRlZCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBhdXRoLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX25ld19hdXRoOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBhdXRoIGF0dHJpYnV0ZXMgdGhhdCBjaGFuZ2VkLiBgQUNDT1VOVF9OVU1CRVJgIGFuZCBgUk9VVElOR19OVU1CRVJgIGFyZSB0aGUgdHdvIHBvdGVudGlhbCB2YWx1ZXMgdGhhdCBjYW4gYmUgZmxhZ2dlZCBhcyB1cGRhdGVkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcIkFDQ09VTlRfTlVNQkVSXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8QXV0aFVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2F1dGg6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8QXV0aFVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCQUNTIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudHNgIGZvciB3aGljaCBudW1iZXJzIGFyZSBiZWluZyByZXRyaWV2ZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEF1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHRoYXQgY2FwdHVyZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF1dGggZmVhdHVyZXMgb2YgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhTdXBwb3J0ZWRNZXRob2RzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0ZWRfbWV0aG9kczogQXV0aFN1cHBvcnRlZE1ldGhvZHMgfCBudWxsO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB3aGljaCBhdXRoIG1ldGhvZHMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IGF1dGggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfYXV0aDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBtYXRjaCBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgaW5zdGFudF9tYXRjaDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgYXV0b21hdGVkIG1pY3JvZGVwb3NpdHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBhdXRvbWF0ZWRfbWljcm9fZGVwb3NpdHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWljcm9kZXBvc2l0cyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWljcm9fZGVwb3NpdHM6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBhdXRoIGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXV0aFVwZGF0ZVR5cGVzIHtcbiAgICBBY2NvdW50TnVtYmVyID0gJ0FDQ09VTlRfTlVNQkVSJyxcbiAgICBSb3V0aW5nTnVtYmVyID0gJ1JPVVRJTkdfTlVNQkVSJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBpcyB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzLiBXZSByZWNvbW1lbmQgY29tbXVuaWNhdGluZyB0byB5b3VyIHVzZXJzIHdoZW4gdGhpcyBldmVudCBpcyByZWNlaXZlZCB0byBub3RpZnkgdGhlbSB0aGF0IHRoZWlyIGFjY291bnQgaXMgdmVyaWZpZWQgYW5kIHJlYWR5IGZvciB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIENvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbGFuY2VQbHVzQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfNjBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzI4ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgcmVjZWl2ZXIgYmFuayBhY2NvdW50IGlzIGNsb3NlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Nsb3NlZDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfZnJvemVuX29yX3Jlc3RyaWN0ZWQ6IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBIGZpdmUtdGllciByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSB0cmFuc2FjdGlvbiwgYmFzZWQgb24gdGhlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBvZiBBQ0ggcmV0dXJucywgbWVhc3VyZWQgYnkgdGhlIGluY2lkZW50IHJhdGUuICAgRWFjaCB0aWVyIGNvcnJlc3BvbmRzIHRvIGEgZGlzdHJpYnV0aW9uIHdpdGggYSBkaWZmZXJlbnQgbWVhbiAoYXZlcmFnZSkgcHJvYmFiaWxpdHkuICAgYEhJR0hgOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgYWJvdmUgNDAlLiBgTUVESVVNX0hJR0hgOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgMTUlLTQwJS4gIGBNRURJVU1gOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgNS0xMCUuIGBNRURJVU1fTE9XYDogVGhlIG1lYW4gcHJvYmFiaWxpdHkgb2YgQUNIIHJldHVybiByaXNrIGlzIDElLTIlLiBgTE9XYDogVGhlIG1lYW4gcHJvYmFiaWxpdHkgb2YgQUNIIHJldHVybiByaXNrIGlzIGJlbG93IDElLiAgIE5vdGUgdGhhdCB0aGVzZSB0aWVycyBjb3JyZXNwb25kIHRvIHByb2JhYmlsaXR5ICpkaXN0cmlidXRpb25zKiBhbmQgbm90IHRvIGRpc2NyZXRlIHByb2JhYmlsaXRpZXMuICAgVGhlc2UgdGllciBkZWZpbml0aW9ucyBhcmUgc3BlY2lmaWMgdG8gQmFsYW5jZSBQbHVzIGFuZCBkbyBub3QgYXBwbHkgdG8gcmlzayB0aWVycyBnZW5lcmF0ZWQgYnkgb3RoZXIgUGxhaWQgZW5kcG9pbnRzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbGFuY2VQbHVzUmlza0xldmVsIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIE1lZGl1bUhpZ2ggPSAnTUVESVVNX0hJR0gnLFxuICAgIE1lZGl1bSA9ICdNRURJVU0nLFxuICAgIE1lZGl1bUxvdyA9ICdNRURJVU1fTE9XJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZUNvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCBpbiBDUkEgZW5hYmxlZCBjbGllbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdDogQmFua0luY29tZUNvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZWZyZXNoIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSByZWZyZXNoZWQgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCBmYWlsZWQgdG8gYmUgZ2VuZXJhdGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVmcmVzaGVkIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLiBUbyBnZXQgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgdmlhIHRoZSBbRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vZGV2ZWxvcGVycy93ZWJob29rcykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdDogQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBjaGFuZ2UgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBpcyBkZXRlY3RlZC4gWW91IHNob3VsZCBjYWxsIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHRvIGdldCB1cGRhdGVkIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci4gVG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHN1YnNjcmliZSBpbiB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgYmVjYXVzZSBhbiBhY2NvdW50IGlzIG92ZXJkcmF3biBvciBiZWNhdXNlIGFuIGluZWxpZ2libGUgYWNjb3VudCBpcyB1c2VkLiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwMVxcXCIsIFxcXCJSMDJcXFwiLCBcXFwiUjAzXFxcIiwgXFxcIlIwNFxcXCIsIFxcXCJSMDZcXFwiLCBcXFwiUjA4XFxcIiwgIFxcXCJSMDlcXFwiLCBcXFwiUjEzXFxcIiwgXFxcIlIxNlxcXCIsIFxcXCJSMTdcXFwiLCBcXFwiUjIwXFxcIiwgXFxcIlIyM1xcXCIuIFRoZXNlIHJldHVybnMgaGF2ZSBhIHR1cm5hcm91bmQgdGltZSBvZiAyIGJhbmtpbmcgZGF5cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgYGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBlaWdodCByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wJSAtIDAuNSUgICAyOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC41JSAtIDEuNSUgICAzOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMS41JSAtIDMlICAgNDogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDMlIC0gNSUgICA1OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gNSUgLSAxMCUgICA2OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTAlIC0gMTUlICAgNzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDE1JSBhbmQgNTAlICAgODogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gNTAlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIGEgYmFuayB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlIC0gdGhlIHN1bSBvZiBhbGwgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2ZlciBhbW91bnRzIG1pbnVzIGFsbCBjcmVkaXQgdHJhbnNmZXIgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHJhbnNhY3RhYmxlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBmb3Igd2hpY2ggYmFsYW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBCYW5rVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYCBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMsIG9yIGBpbmJvdW5kYCBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBCYW5rVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0QmFua1RyYW5zZmVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZXM/OiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgYmFuayB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBiYW5rIHRyYW5zZmVyIGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyBiYW5rIHRyYW5zZmVyIHJlcHJlc2VudHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZXZlcnNlZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXZlcnNlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIHR5cGUgb2YgdGhpcyB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV2ZXJzZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldmVyc2VkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbQmFuayBUcmFuc2ZlcnMgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9iYW5rLXRyYW5zZmVycy8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGJhbmsgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcnM6IEFycmF5PEJhbmtUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gVGhpcyBpcyB0aGUgQUJBIG51bWJlcjsgZm9yIHNvbWUgaW5zdGl0dXRpb25zLCB0aGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgQUNIIG51bWJlciB1c2VkIGluIGByb3V0aW5nX251bWJlcmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuIFZhbGlkIG9wdGlvbnMgYXJlIGBhY2hgLCBgc2FtZS1kYXktYWNoYCwgb3IgYHdpcmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFdpcmUgPSAnd2lyZSdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcCBkZXNjcmliZXMgYSBzd2VlcCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogQmFua1RyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCB0aGF0IHRoZSBzd2VlcHMgYmVsb25nIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN3ZWVwcyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlclN3ZWVwPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PEJhbmtUcmFuc2ZlclN3ZWVwPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJhbmsgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVy4oCZcyBmdWxsIGxlZ2FsIG5hbWUuIElmIHRoZSB0cmFuc2ZlciBgYWNoX2NsYXNzYCBpcyBgY2NkYCwgdGhpcyBzaG91bGQgYmUgdGhlIGJ1c2luZXNzIG5hbWUgb2YgdGhlIGFjY291bnQgaG9sZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVy4oCZcyBlbWFpbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVyXFwncyByb3V0aW5nIG51bWJlci4gVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaW4gcmVzcG9uc2UgZGF0YS4gRG8gbm90IHByb3ZpZGUgdGhpcyBmaWVsZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IGJhbmsgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBBQ0ggZXZlbnRzIGFyZSBhdmFpbGFibGUuIFRvIGJlZ2luIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIHlvdSBtdXN0IGZpcnN0IHJlZ2lzdGVyIHlvdXIgd2ViaG9vayBsaXN0ZW5lciBlbmRwb2ludCB2aWEgdGhlIFt3ZWJob29rcyBwYWdlIGluIHRoZSBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3dlYmhvb2tzKS4gVGhlIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGNhbiBiZSB1c2VkIHRvIHRyYWNrIHRoZSBwcm9ncmVzcyBvZiBBQ0ggdHJhbnNmZXJzIHVzZWQgaW4gW21pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uXSgvZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC4gTm90ZSB0aGF0IFtUcmFuc2Zlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgY3VzdG9tZXJzIHNob3VsZCB1c2UgVHJhbnNmZXIgd2ViaG9va3MgaW5zdGVhZCBvZiB1c2luZyBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWA7IHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKSBmb3IgbW9yZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGgge1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgQmFzZSBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEJhc2UgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQmFzZSBSZXBvcnQgd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF0ZV9nZW5lcmF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IFBsYWlkIGFib3V0IGVhY2ggb2YgdGhlIEl0ZW1zIGluY2x1ZGVkIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEJhc2VSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91c2x5IHN1Ym1pdHRlZCB2YWxpZCBkaXNwdXRlIHN0YXRlbWVudHMgYnkgdGhlIGNvbnN1bWVyXG4gICAgICogQHR5cGUge0FycmF5PENvbnN1bWVyRGlzcHV0ZT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZXM6IEFycmF5PENvbnN1bWVyRGlzcHV0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBCYXNlIFJlcG9ydCBlbmRwb2ludHMuIFRyYW5zYWN0aW9uIGhpc3RvcnkgcmV0dXJuZWQgYnkgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHRvcC1sZXZlbCBgdHJhbnNhY3Rpb25zYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBUaGlzIGFycmF5IGNhbiBhbHNvIGJlIGVtcHR5IGlmIG5vIG93bmVycyBhcmUgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZTogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cyBhbmQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgYGJyb2tlcmFnZWAgb3IgYGludmVzdG1lbnRgIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM/OiBBcnJheTxCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaW5zaWdodHM/OiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogQmFzZVJlcG9ydEF0dHJpYnV0ZXM7XG59XG4vKipcbiAqIEJhc2UgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBvZiBlYWNoIGNhbGVuZGFyIG1vbnRoXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgaW5zaWdodHMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbW9zdF9yZWNlbnRfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgZGF5cyBhdmFpbGFibGUgaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMb25nZXN0IGdhcCBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIGluIGEgdGltZSBwZXJpb2QuIFRoaXMgYXJyYXkgY2FuIGluY2x1ZGUgbXVsdGlwbGUgdGltZSBwZXJpb2RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvbmdlc3RfZ2Fwc19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IEFycmF5PEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGViaXRzIGludG8gdGhlIGFjY291bnQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2luZmxvd3M/OiBBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9pbmZsb3dfYW1vdW50cz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG91dGZsb3dzIGZyb20gdGhlIGFjY291bnQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX291dGZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBhbW91bnQgb2YgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgYWNjb3VudCBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9vdXRmbG93X2Ftb3VudHM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBubyB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2RheXNfbm9fdHJhbnNhY3Rpb25zPzogbnVtYmVyO1xufVxuLyoqXG4gKiBCYXNlIFJlcG9ydCBtZXRhZGF0YSBhYm91dCB0aGUgZXh0cmFjdGVkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZXh0cmFjdGVkIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlZCBhdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSB0cmFuc2FjdGlvbi1sZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIE5TRiBhbmQgb3ZlcmRyYWZ0IGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHRpbWUgcmFuZ2UgZm9yIHRoZSByZXBvcnQgaW4gdGhlIGdpdmVuIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIE5TRiBhbmQgb3ZlcmRyYWZ0IGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cyBmb3IgYSBnaXZlbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgTlNGIGFuZCBvdmVyZHJhZnQgZmVlIHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCA2MCBkYXlzIGZvciBhIGdpdmVuIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBOU0YgYW5kIG92ZXJkcmFmdCBmZWUgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDkwIGRheXMgZm9yIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBQcmVkaWN0aW9uIGluZGljYXRvciBvZiB3aGV0aGVyIHRoZSBhY2NvdW50IGlzIGEgcHJpbWFyeSBhY2NvdW50LiBPbmx5IG9uZSBhY2NvdW50IHBlciBhY2NvdW50IHR5cGUgYWNyb3NzIHRoZSBpdGVtcyBjb25uZWN0ZWQgd2lsbCBoYXZlIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19wcmltYXJ5X2FjY291bnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSByYW5naW5nIGZyb20gMC0xLiBUaGUgaGlnaGVyIHRoZSBzY29yZSwgdGhlIG1vcmUgY29uZmlkZW50IHdlIGFyZSBvZiB0aGUgYWNjb3VudCBiZWluZyB0aGUgcHJpbWFyeSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpbWFyeV9hY2NvdW50X3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudD86IFRvdGFsSW5mbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnQzMGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF8zMGQ/OiBUb3RhbEluZmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsSW5mbG93QW1vdW50NjBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfNjBkPzogVG90YWxJbmZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbEluZmxvd0Ftb3VudDkwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzkwZD86IFRvdGFsSW5mbG93QW1vdW50OTBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50PzogVG90YWxPdXRmbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50MzBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzMwZD86IFRvdGFsT3V0Zmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsT3V0Zmxvd0Ftb3VudDYwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF82MGQ/OiBUb3RhbE91dGZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbE91dGZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfOTBkPzogVG90YWxPdXRmbG93QW1vdW50OTBkIHwgbnVsbDtcbn1cbi8qKlxuICogQXZlcmFnZSBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBvciBkZWJpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEF2ZXJhZ2UgYmFsYW5jZSBpbiBkb2xsYXIgYW1vdW50IHBlciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U6IENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeTtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYSBCYXNlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJhc2VSZXBvcnRBY2NvdW50Pjtcbn1cbi8qKlxuICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIHBlciBjYWxlbmRhciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExhcmdlc3QgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5cz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBudW1iZXIgb2YgY3JlZGl0cyBvciBkZWJpdHMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjcmVkaXRzIG9yIGRlYml0cyBvdXQgb2YgdGhlIGFjY291bnQgZm9yIHRoaXMgdGltZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGNvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgdHJhbnNhY3Rpb24gdG9vayBwbGFjZSwgaW4gSVMwIDg2MDEgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogQmFzZVJlcG9ydFRyYW5zYWN0aW9uVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhIEJhc2UgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQmFzZSBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0V2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFTRV9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0V2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBCYXNlUmVwb3J0V2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuIGBVU0VSX0ZSQVVEX0FMRVJUYCBpbmRpY2F0ZXMgdGhhdCB0aGUgVXNlciBoYXMgcGxhY2VkIGEgZnJhdWQgYWxlcnQgb24gdGhlaXIgUGxhaWQgQ2hlY2sgY29uc3VtZXIgcmVwb3J0IGR1ZSB0byBzdXNwZWN0ZWQgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYXNlUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIE93bmVyc1VuYXZhaWxhYmxlID0gJ09XTkVSU19VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJyxcbiAgICBVc2VyRnJhdWRBbGVydCA9ICdVU0VSX0ZSQVVEX0FMRVJUJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBUaGUgcmVzdWx0aW5nIGBlcnJvcmAgd2lsbCBoYXZlIGFuIGBlcnJvcl90eXBlYCBvZiBgQkFTRV9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkFTRV9SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvYmplY3QgY29udGFpbnMgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyBhY2NvdW50IHJpc2suIEV4YW1wbGVzIG9mIGRhdGEgaW5jbHVkZTogYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IFNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB0aGUgY29uc3VtZXIsIG9yIGlzIGF0IHJpc2sgb2YgYmVpbmcgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBpdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBhdmFpbGFibGUgdG8gUGxhaWQgZm9yIHRoaXMgYWNjb3VudC4gVGhpcyBtZWFzdXJlLCBjb21iaW5lZCB3aXRoIFBsYWlkIGNvbm5lY3Rpb24gaGlzdG9yeSwgY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIGFnZSBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3Rfb2JzZXJ2ZWRfdHJhbnNhY3Rpb246IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgaW4gdGhlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzcG9uc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlcztcbn1cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgYWNjb3VudCByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6IGBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb25gOiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWQgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5cyBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgYHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50YDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBTYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIG9yIHRoZSBjb25zdW1lciwgb3IgaXMgYXQgcmlzayBvZiBiZWluZyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9jbG9zZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXZhaWxhYmxlIHRvIFBsYWlkIGZvciB0aGlzIGFjY291bnQuIFRoaXMgbWVhc3VyZSwgY29tYmluZWQgd2l0aCBQbGFpZCBjb25uZWN0aW9uIGhpc3RvcnksIGNhbiBiZSB1c2VkIHRvIGluZmVyIHRoZSBhZ2Ugb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X29ic2VydmVkX3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB5b3Ugd2FudCB0byBldmFsdWF0ZSByaXNrLiBgT05CT0FSRElOR2A6IHVzZXIgbGlua3MgYSBmaXJzdCBiYW5rIGFjY291bnQgYXMgcGFydCBvZiB0aGUgb25ib2FyZGluZyBmbG93IG9mIHlvdXIgcGxhdGZvcm0uIGBORVdfQUNDT1VOVGA6IHVzZXIgbGlua3MgYW5vdGhlciBiYW5rIGFjY291bnQgb3IgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBsaW5rZWQgYmFuayBhY2NvdW50IG9uIHlvdXIgcGxhdGZvcm0uIGBJTkZPUk1BVElPTl9DSEFOR0VgOiB1c2VyIGNoYW5nZXMgdGhlaXIgaW5mb3JtYXRpb24gb24geW91ciBwbGF0Zm9ybSwgZS5nLiwgdXBkYXRpbmcgdGhlaXIgcGhvbmUgbnVtYmVyLiBgRE9STUFOVF9VU0VSYDogIHlvdSBkZWNpZGUgdG8gcmUtZXZhbHVhdGUgYSB1c2VyIHRoYXQgYmVjb21lcyBhY3RpdmUgYWZ0ZXIgYSBwZXJpb2Qgb2YgaW5hY3Rpdml0eS4gICBgT1RIRVJgOiBhbnkgb3RoZXIgcmVhc29ucyBub3QgbGlzdGVkIGhlcmUgUG9zc2libGUgdmFsdWVzOiAgYE9OQk9BUkRJTkdgLCBgTkVXX0FDQ09VTlRgLCBgSU5GT1JNQVRJT05fQ0hBTkdFYCwgYERPUk1BTlRfVVNFUmAsIGBPVEhFUmAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlRXZhbHVhdGlvblJlYXNvbiB7XG4gICAgT25ib2FyZGluZyA9ICdPTkJPQVJESU5HJyxcbiAgICBOZXdBY2NvdW50ID0gJ05FV19BQ0NPVU5UJyxcbiAgICBJbmZvcm1hdGlvbkNoYW5nZSA9ICdJTkZPUk1BVElPTl9DSEFOR0UnLFxuICAgIERvcm1hbnRVc2VyID0gJ0RPUk1BTlRfVVNFUicsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdjEvYmVhY29uL2FjY291bnRfcmlzay9yaXNrL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgZXZhbHVhdGlvbnMgYW5kL29yIG11bHRpcGxlIGxpbmtlZCBhY2NvdW50cy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X3VzZXJfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBvZiB3aGF0IHlvdSBhcmUgbG9va2luZyB0byBldmFsdWF0ZSAoYWNjb3VudCBhZGQsIGluZm9ybWF0aW9uIGNoYW5nZSwgZXRjLikgdG8gYWxsb3cgdXMgdG8gdGllIHRoZSBhY3Rpdml0eSB0byB0aGUgZGVjaXNpb25zIGFuZCBwb3NzaWJsZSBmcmF1ZCBvdXRjb21lIHNlbnQgdmlhIG91ciBmZWVkYmFjayBlbmRwb2ludHMuIFlvdSBjYW4gdXNlIHlvdXIgaW50ZXJuYWwgcmVxdWVzdCBJRCBvciBzaW1pbGFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2V2YWx1YXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVFdmFsdWF0aW9uUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2YWx1YXRpb25fcmVhc29uPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUV2YWx1YXRpb25SZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGZvciBldmFsdWF0aW9uIGhhcyBvY2N1cnJlZC4gUG9wdWxhdGUgdGhpcyBmaWVsZCBmb3IgYmFja2ZpbGxpbmcgZGF0YS4gSWYgeW91IGRvbuKAmXQgcG9wdWxhdGUgdGhpcyBmaWVsZCwgd2XigJlsbCB1c2UgdGhlIHRpbWVzdGFtcCBhdCB0aGUgdGltZSBvZiByZWNlaXB0LiBVc2UgSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmFsdWF0ZV90aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzdWx0cyB0byBhIHN1YnNldCBvZiB0aGUgYWNjb3VudHMgb24gdGhlIGxpbmtlZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgZm9yIHRoZSBzcGVjaWZpYyBhY2NvdW50cyB0byBldmFsdWF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIGEgcmlzayBldmFsdWF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQ+O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjaGFuZ2UgbWFkZSB0byB0aGUgcGFyZW50IG9iamVjdCBzcGVjaWZ5aW5nIHdoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyB3aGVuIGl0IG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BdWRpdFRyYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWxTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2U7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hhdCBjYXVzZWQgYSByZXNvdXJjZSB0byBiZSBjaGFuZ2VkIG9yIHVwZGF0ZWQuICAgYGRhc2hib2FyZGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBieSBhIG1lbWJlciBvZiB5b3VyIHRlYW0gdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuICBgYXBpYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIHZpYSB0aGUgUGxhaWQgQVBJLiAgYHN5c3RlbWAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgcGFydCBvZiB0aGUgUGxhaWQgQmVhY29uIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGlmIGFub3RoZXIgYnVzaW5lc3MgdXNpbmcgUGxhaWQgQmVhY29uIGNyZWF0ZWQgYSBmcmF1ZCByZXBvcnQgdGhhdCBtYXRjaGVkIG9uZSBvZiB5b3VyIHVzZXJzLCB5b3VyIG1hdGNoaW5nIHVzZXJcXCdzIHN0YXR1cyB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgYW5kIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYHN5c3RlbWAuICBgYnVsa19pbXBvcnRgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYXMgcGFydCBvZiBhIGJ1bGsgaW1wb3J0IHByb2Nlc3MuIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbXBhbnkgcHJvdmlkZWQgYSBDU1Ygb2YgdXNlciBkYXRhIGFzIHBhcnQgb2YgeW91ciBpbml0aWFsIG9uYm9hcmRpbmcsIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYGJ1bGtfaW1wb3J0YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2Uge1xuICAgIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nLFxuICAgIEJ1bGtJbXBvcnQgPSAnYnVsa19pbXBvcnQnXG59XG5cbi8qKlxuICogQmFuayBBY2NvdW50IEluc2lnaHRzIGVuY2Fwc3VsYXRlIHRoZSByaXNrIGluc2lnaHRzIGZvciBhIHNpbmdsZSBCYW5rIEFjY291bnQgbGlua2VkIHRvIGFuIEl0ZW0gdGhhdCBpcyBhc3NvY2FpdGVkIHdpdGggYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXR0cmlidXRlczogQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQmFuayBBY2NvdW50cyBsaW5rZWQgdG8gYW4gSXRlbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElEIHRoZSBCYW5rIEFjY291bnRzIGJlbG9uZyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudHNcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudHNcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmVhY29uQmFua0FjY291bnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBjcmVhdGVkIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiBtYXRjaGVzIG9uZSBvZiB5b3VyIGV4aXN0aW5nIHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERVUExJQ0FURV9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIER1cGxpY2F0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fZHVwbGljYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBEdXBsaWNhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBtYXRjaGluZyBCZWFjb24gVXNlcnMgYW5kIGFuIGFuYWx5c2lzIG9mIHRoZSBmaWVsZHMgdGhleSBtYXRjaGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMTogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIyOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gb25lIEJlYWNvbiBVc2VyIGFuZCBhbm90aGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gdHdvIEJlYWNvbiBVc2Vycy4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlci4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIHRoZSBvdGhlciBCZWFjb24gVXNlci4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG9yaWdpbmFsIEJlYWNvbiBVc2VyIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBub3QgcHJlc2VudCBpbiBvbmUgb2YgdGhlIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbk1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRDcmVhdGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0Q3JlYXRlVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ/OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIEJlYWNvbiBSZXBvcnQuICBgZmlyc3RfcGFydHlgOiBJZiB0aGlzIGlzIHRoZSBzYW1lIGluZGl2aWR1YWwgYXMgdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3RvbGVuYDogSWYgdGhpcyBpcyBhIGRpZmZlcmVudCBpbmRpdmlkdWFsIGZyb20gdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3ludGhldGljYDogSWYgdGhpcyBpcyBhbiBpbmRpdmlkdWFsIHVzaW5nIGZhYnJpY2F0ZWQgaW5mb3JtYXRpb24uICBgYWNjb3VudF90YWtlb3ZlcmA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgYWNjb3VudCB3YXMgY29tcHJvbWlzZWQuICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0Q3JlYXRlVHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2VycyBpcyBmaXJzdCByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX0NSRUFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0czogQXJyYXk8QmVhY29uUmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIHJlcHJlc2VudHMgYSBCZWFjb24gUmVwb3J0IGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdXIgb3JnYW5pemF0aW9uIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIEJlYWNvbiBVc2VyIHlvdVxcJ3ZlIGNyZWF0ZWQuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uICBUaGUgYHJlcG9ydGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzOiBBcnJheTxCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlcG9ydCBjcmVhdGVkIG9uIHRoZSBCZWFjb24gTmV0d29yayBtYXRjaGVzIHdpdGggb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9TWU5ESUNBVElPTl9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0U3luZGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25zOiBBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIGEgQmVhY29uIFJlcG9ydCB0aGF0IGhhcyBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBtYXRjaGluZyBCZWFjb24gVXNlciBpbiB5b3VyIHByb2dyYW0uICBUaGUgYGlkYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaXMgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgdGhhdCB3YXMgc3luZGljYXRlZC4gSWYgdGhlIG9yaWdpbmFsIHJlcG9ydCB3YXMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiwgdGhlIGZpZWxkIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIElEIG9mIHRoZSByZXBvcnQuIE90aGVyd2lzZSwgdGhlIGZpZWxkIHdpbGwgYmUgYG51bGxgIGluZGljYXRpbmcgdGhhdCB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGBkYXRhX2JyZWFjaGA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgZGF0YSB3YXMgY29tcHJvbWlzZWQgaW4gYSBicmVhY2guICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0VHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIGV4aXN0aW5nIEJlYWNvbiBSZXBvcnRzIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoZXRoZXIgdGhpcyBhY2NvdW50IG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IG51bWVyaWMgY2hhcmFjdGVycyBvZiB0aGlzIGFjY291bnTigJlzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhY2NvdW50X21hc2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBtYXRjaF9zdGF0dXM6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCBJdGVtIElEcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgdGhlIHJpc2sgaW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcXCdzIEJhbmsgQWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2FjY291bnQvaW5zaWdodHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkJhbmtBY2NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19hY2NvdW50X2luc2lnaHRzOiBCZWFjb25CYW5rQWNjb3VudHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIGEgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuICBUaGUgcHJpbWFyeSB1c2UgZm9yIHRoaXMgZW5kcG9pbnQgaXMgdG8gYWRkIGEgbmV3IGVuZCB1c2VyIHRvIEJlYWNvbiBmb3IgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy4gIFNvbWUgZmllbGRzIGFyZSBvcHRpb25hbCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB0byBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGlzIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgdG8gbGluayBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIgYW5kIGhhdmUgdGhlbSBldmFsdWF0ZWQgZm9yIEFjY291bnQgSW5zaWdodHMuIEEgbWF4aW11bSBvZiA1MCBhY2NvdW50cyB0b3RhbCBjYW4gYmUgYWRkZWQgdG8gYSBzaW5nbGUgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnlfYWNjb3VudHM6IEFycmF5PEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIHRoaXMgYWNjb3VudOKAmXMgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyB0aGUgaGlzdG9yeSBvZiBhIEJlYWNvbiBVc2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyczogQXJyYXk8QmVhY29uVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgSUQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGlkZW50aXR5IGRvY3VtZW50IHZhbHVlIHR5cGVkIGluIGJ5IHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC4gRm9yIHNwZWNpZmljIGZvcm1hdCByZXF1aXJlbWVudHMgYnkgSUQgdHlwZSwgc2VlIFtIeWJyaWQgSW5wdXQgVmFsaWRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24vKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay4gIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEJlYWNvbiBVc2VyLCBpbiBhZGRpdGlvbiB0byB0aGUgYG5hbWVgLCBfZWl0aGVyXyB0aGUgYGRhdGVfb2ZfYmlydGhgIF9vcl8gdGhlIGBkZXBvc2l0b3J5X2FjY291bnRzYCBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgYSBsaXN0IG9mIGJhbmsgYWNjb3VudHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuIFRoZXNlIGFjY291bnRzIHdpbGwgYmUgc2Nhbm5lZCBhY3Jvc3MgdGhlIEJlYWNvbiBOZXR3b3JrIGFuZCB1c2VkIHRvIGZpbmQgZHVwbGljYXRlIHJlY29yZHMuICBOb3RlOiBUaGVzZSBhY2NvdW50cyB3aWxsIG5vdCBoYXZlIEJhbmsgQWNjb3VudCBJbnNpZ2h0cy4gVG8gcmVjZWl2ZSBCYW5rIEFjY291bnQgSW5zaWdodHMgcGxlYXNlIHN1cHBseSBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBVUyBCYW5rIEFjY291bnQgTnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnRcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciBSZXZpc2lvbiBpZGVudGlmaWVzIGEgQmVhY29uIFVzZXIgYXQgc29tZSBwb2ludCBpbiBpdHMgcmV2aXNpb24gaGlzdG9yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdmVyc2lvbmAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXZpc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBgcmVqZWN0ZWRgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gcmVqZWN0ZWQgZm9yIGZyYXVkLiBVc2VycyBjYW4gYmUgYXV0b21hdGljYWxseSBvciBtYW51YWxseSByZWplY3RlZC4gIGBwZW5kaW5nX3Jldmlld2A6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBtYXJrZWQgZm9yIHJldmlldy4gIGBjbGVhcmVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIGNsZWFyZWQgb2YgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25Vc2VyU3RhdHVzIHtcbiAgICBSZWplY3RlZCA9ICdyZWplY3RlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgQ2xlYXJlZCA9ICdjbGVhcmVkJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciB3aGVuIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlbmQgdGhpcyBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIHRvIGFkZCBhY2NvdW50cyB0byB0aGlzIHVzZXIgZm9yIGV2YWx1YXRpb24uIFRoaXMgd2lsbCBhZGQgYWNjb3VudHMgdG8gdGhpcyBCZWFjb24gVXNlci4gSWYgbGVmdCBudWxsIG9ubHkgZXhpc3RpbmcgYWNjb3VudHMgd2lsbCBiZSByZXR1cm5lZCBpbiByZXNwb25zZS4gQSBtYXhpbXVtIG9mIDUwIGFjY291bnRzIHRvdGFsIGNhbiBiZSBhZGRlZCB0byBhIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZC4gSWYgbGVmdCB1bnNldCBvciBudWxsLCB1c2VyIGRhdGEgd2lsbCBub3QgYmUgcGF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWVOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZT86IEJlYWNvblVzZXJOYW1lTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgSXRlbSBJRHMgY29ycmVzcG9uZGluZyB0byB0aGUgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvcmVnaXN0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBsb2FucyB0byByZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblJlZ2lzdGVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2FuczogQXJyYXk8Q3JhTG9hblJlZ2lzdGVyPjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb25zIG9mIGNhc2hmbG93IGF0dHJpYnV0ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24ge1xuICAgIFYxMCA9ICd2MS4wJ1xufVxuXG4vKipcbiAqIENhdGVnb3JpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2F0ZWdvcmllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbiBjYXRlZ29yaWVzIHVzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSB0cmFuc2FjdGlvbiBjYXRlZ29yeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmeWluZyBudW1iZXIgZm9yIHRoZSBjYXRlZ29yeS4gYGNhdGVnb3J5X2lkYCBpcyBhIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gbWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBwbGFjZWAgZm9yIHBoeXNpY2FsIHRyYW5zYWN0aW9ucyBvciBgc3BlY2lhbGAgZm9yIG90aGVyIHRyYW5zYWN0aW9ucyBzdWNoIGFzIGJhbmsgY2hhcmdlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyBgY2F0ZWdvcnlfaWRgIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgaGllcmFyY2h5OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvYmplY3QgZm9yIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBDYXRlZ29yeSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkgc29ydGVkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3BfY291bnRlcnBhcnRpZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvbiBhIHVzZXJcXCdzIHRvcCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluc2lnaHRzIG9mIHRvcCBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmltYXJ5X2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIHJhbmtlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRldGFpbGVkX2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG59XG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogUGxhaWRFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2Vy4oCZcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlcuKAmXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhpcyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlQWxsT2ZcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiB0aGF0IFBsYWlkIGhhcyBlbmhhbmNlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgdHJhbnNhY3Rpb24gaWRlbnRpZmllciB0byB0aWUgdHJhbnNhY3Rpb25zIGJhY2sgdG8gY2xpZW50c1xcJyBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VuaGFuY2VtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5oYW5jZW1lbnRzOiBFbmhhbmNlbWVudHM7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVucmljaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiBhcyBwcm92aWRlZCBieSB5b3UgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHVzZXIsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfdXNlcl9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2htZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5yaWNobWVudHM6IEVucmljaG1lbnRzO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5oYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGlyZWN0aW9uLiAoTk9URTogdGhpcyB3aWxsIGFmZmVjdCBlbnJpY2htZW50IHJlc3VsdHMsIHNvIGRpcmVjdGlvbnMgYXJlIGltcG9ydGFudCk6LiAgIE5lZ2F0aXZlICgtKSBmb3IgY3JlZGl0cyAoZS5nLiwgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzKSAgIFBvc2l0aXZlICgrKSBmb3IgZGViaXRzIChlLmcuLCBwdXJjaGFzZXMsIGZlZXMsIG91dGdvaW5nIHRyYW5zZmVycylcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5yaWNoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGhlbHAgeW91IHRpZSBkYXRhIGJhY2sgdG8geW91ciBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF91c2VyX2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBJZiB5b3UgaGF2ZSBsb2NhdGlvbiBkYXRhIGluIGF2YWlsYWJsZSBhbiB1bnN0cnVjdHVyZWQgZm9ybWF0LCBpdCBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMCkuIFdoZW4gdGVzdGluZyBFbnJpY2gsIG5vdGUgdGhhdCBgYW1vdW50YCBkYXRhIHNob3VsZCBiZSByZWFsaXN0aWMuIFVucmVhbGlzdGljIG9yIGluYWNjdXJhdGUgYGFtb3VudGAgZGF0YSBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcXVhbGl0eSBvdXRwdXQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBjb2RlcyAoTUNDcykgYXJlIGZvdXItZGlnaXQgbnVtYmVycyB0aGF0IGRlc2NyaWJlIGEgbWVyY2hhbnRcXCdzIHByaW1hcnkgYnVzaW5lc3MgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWNjPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZS4gIFVzZSB0aGlzIGZpZWxkIHRvIHBhc3MgaW4gc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB5b3UgbWF5IGhhdmUgYWJvdXQgeW91ciB0cmFuc2FjdGlvbnMuIFByb3ZpZGluZyBsb2NhdGlvbiBkYXRhIGlzIG9wdGlvbmFsIGJ1dCBjYW4gaW5jcmVhc2UgcmVzdWx0IHF1YWxpdHkuIElmIHlvdSBoYXZlIHVuc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGNvbnNlbnQgZXZlbnQgb2NjdXJyZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zZW50RXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlPzogQ29uc2VudEV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfY29kZT86IENvbnNlbnRFdmVudENvZGU7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50SW5pdGlhdG9yfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I/OiBDb25zZW50RXZlbnRJbml0aWF0b3I7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyB0aGUgZW5kIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0uICBTZWUgdGhlIFtmdWxsIGxpc3RdKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jdXBkYXRpbmctbGluay1jdXN0b21pemF0aW9ucykgb2YgdXNlIGNhc2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBmdWxsIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhlIGVuZCB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtLiBUaGVzZSBjb3JyZXNwb25kIHRvIGNvbnNlbnRlZCBwcm9kdWN0czsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGF1dGhvcml6YXRpb25zIGFyZSBncmFudGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25zZW50ZWRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY29uc2VudGVkX2FjY291bnRzPzogQXJyYXk8Q29uc2VudGVkQWNjb3VudD47XG59XG4vKipcbiAqIENvZGVzIGRlc2NyaWJpbmcgdGhlIG9iamVjdCBvZiBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRDb2RlIHtcbiAgICBVc2VyQWdyZWVtZW50ID0gJ1VTRVJfQUdSRUVNRU5UJyxcbiAgICBVc2VDYXNlcyA9ICdVU0VfQ0FTRVMnLFxuICAgIERhdGFTY29wZXMgPSAnREFUQV9TQ09QRVMnLFxuICAgIEFjY291bnRTY29wZXMgPSAnQUNDT1VOVF9TQ09QRVMnXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSB0aGF0IGluaXRpYXRlZCBjb2xsZWN0aW9uIG9mIGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRJbml0aWF0b3Ige1xuICAgIFBsYWlkID0gJ1BMQUlEJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgQ3VzdG9tZXIgPSAnQ1VTVE9NRVInLFxuICAgIEVuZFVzZXIgPSAnRU5EX1VTRVInXG59XG5cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgY29uc2VudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnNlbnRFdmVudFR5cGUge1xuICAgIEdyYW50ZWQgPSAnQ09OU0VOVF9HUkFOVEVEJyxcbiAgICBSZXZva2VkID0gJ0NPTlNFTlRfUkVWT0tFRCcsXG4gICAgVXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnXG59XG5cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29uc2VudCBldmVudHMuXG4gICAgICogQHR5cGUge0FycmF5PENvbnNlbnRFdmVudD59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXZlbnRzOiBBcnJheTxDb25zZW50RXZlbnQ+O1xufVxuLyoqXG4gKiBBIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zZW50ZWRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc2VudGVkQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgdmFsaWQgZGlzcHV0ZSBzdGF0ZW1lbnQgYnkgdGhlIGNvbnN1bWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZSB7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIEEgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpIG9mIHRoZSBjb25zdW1lciBkaXNwdXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIGRpc3B1dGVkIGZpZWxkIChlLmcuIHRyYW5zYWN0aW9uIGRhdGUpLCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgZGlzcHV0ZV9maWVsZF9jcmVhdGVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lckRpc3B1dGVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRleHQgY29udGVudCBvZiBkaXNwdXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgc3RhdGVtZW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFR5cGUgb2YgZGF0YSBiZWluZyBkaXNwdXRlZCBieSB0aGUgY29uc3VtZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5IHtcbiAgICBUcmFuc2FjdGlvbiA9ICdUUkFOU0FDVElPTicsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBJZGVudGl0eSA9ICdJREVOVElUWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NvbnN1bWVyX3JlcG9ydC9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcmVhc29uIHlvdSBhcmUgZ2VuZXJhdGluZyBhIENvbnN1bWVyIFJlcG9ydCBmb3IgdGhpcyB1c2VyLiAgIGBBQ0NPVU5UX1JFVklFV19DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjb25zdW1lciBjcmVkaXQgdHJhbnNhY3Rpb24gZm9yIHRoZSByZXZpZXcgb3IgY29sbGVjdGlvbiBvZiBhbiBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgQUNDT1VOVF9SRVZJRVdfTk9OX0NSRURJVGA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBvZiB0aGUgaW5mb3JtYXRpb24gdG8gcmV2aWV3IGEgbm9uLWNyZWRpdCBhY2NvdW50IHByb3ZpZGVkIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIHB1cnBvc2VzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb25zdW1lciBjb250aW51ZXMgdG8gbWVldCB0aGUgdGVybXMgb2YgdGhlIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKSgyKS4gIGBFTVBMT1lNRU5UYDogRm9yIGVtcGxveW1lbnQgcHVycG9zZXMgcHVyc3VhbnQgdG8gRkNSQSA2MDQoYSkoMykoQiksIGluY2x1ZGluZyBoaXJpbmcsIHJldGVudGlvbiBhbmQgcHJvbW90aW9uIHB1cnBvc2VzLiAgYEVYVEVOU0lPTl9PRl9DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjcmVkaXQgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IGFuZCBpbnZvbHZpbmcgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkdgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgaW4gY29ubmVjdGlvbiB3aXRoIGEgYnVzaW5lc3MgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IHRoZSBjb25zdW1lciBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyBpbiBjb25uZWN0aW9uIHdpdGggYSBwcm9wZXJ0eSByZW50YWwgYXNzZXNzbWVudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKGkpLiAgYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX1BSRVFVQUxJRklDQVRJT05gOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCB0byBldmFsdWF0ZSBhbiBhcHBsaWNhdGlvbuKAmXMgcHJvZmlsZSB0byBtYWtlIGFuIG9mZmVyIHRvIHRoZSBjb25zdW1lci4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSYDogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3cml0dGVuIGluc3RydWN0aW9ucyBvZiB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgyKSwgc3VjaCBhcyB3aGVuIGFuIGluZGl2aWR1YWwgYWdyZWVzIHRvIGFjdCBhcyBhIGd1YXJhbnRvciBvciBhc3N1bWVzIHBlcnNvbmFsIGxpYWJpbGl0eSBmb3IgYSBjb25zdW1lciwgYnVzaW5lc3MsIG9yIGNvbW1lcmNpYWwgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlIHtcbiAgICBBY2NvdW50UmV2aWV3Q3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX0NSRURJVCcsXG4gICAgQWNjb3VudFJldmlld05vbkNyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19OT05fQ1JFRElUJyxcbiAgICBFbXBsb3ltZW50ID0gJ0VNUExPWU1FTlQnLFxuICAgIEV4dGVuc2lvbk9mQ3JlZGl0ID0gJ0VYVEVOU0lPTl9PRl9DUkVESVQnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRUZW5hbnRTY3JlZW5pbmcgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkcnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRPdGhlciA9ICdMRUdJVElNQVRFX0JVU0lORVNTX05FRURfT1RIRVInLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvblByZXF1YWxpZmljYXRpb24gPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9QUkVRVUFMSUZJQ0FUSU9OJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25PdGhlciA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSJ1xufVxuXG4vKipcbiAqIFRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGlzIGZpZWxkIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgdXNlciB0b2tlbi4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHVzZXIgdG9rZW4gY3JlYXRpb24sIHlvdSBjYW4gYWRkIGl0IHRvIHRoZSB1c2VyIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuIE9uY2UgdGhlIGZpZWxkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB1c2VyLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhIG5vbi1lbXB0eSBgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2VgICh3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0KSwgb3IgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBmb3IgdGhhdCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZmlyc3RfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGxhc3RfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTc0NTIxMzBcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWxzXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDQgZGlnaXRzIG9mIHRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgc3NuX2xhc3RfND86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIGFsbCBQbGFpZCBDaGVjayBjdXN0b21lcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluc2lnaHRzIGFyb3VuZCBhIHVzZXJcXCdzIGNvdW50ZXJwYXJ0aWVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIEluc2lnaHRzIHJlbGF0ZWQgdG8gYSB1c2Vy4oCZcyB0cmFuc2FjdGlvbnMgd2l0aCBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgZmluYW5jaWFsX2luc3RpdHV0aW9uX2luc2lnaHRzPzogQXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgYWJvdXQgYSB1c2Vy4oCZcyB0b3AgbWVyY2hhbnRzLCByYW5rZWQgYnkgc3BlbmQuXG4gICAgICogQHR5cGUge0FycmF5PE1lcmNoYW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1lcmNoYW50X2luc2lnaHRzPzogQXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHkgdHlwZS4gIGBtZXJjaGFudGA6IGEgcHJvdmlkZXIgb2YgZ29vZHMgb3Igc2VydmljZXMgZm9yIHB1cmNoYXNlIGBmaW5hbmNpYWxfaW5zdGl0dXRpb25gOiBhIGZpbmFuY2lhbCBlbnRpdHkgKGJhbmssIGNyZWRpdCB1bmlvbiwgQk5QTCwgZmludGVjaCkgYHBheW1lbnRfYXBwYDogYSB0cmFuc2ZlciBvciBQMlAgYXBwIChlLmcuIFplbGxlKSBgbWFya2V0cGxhY2VgOiBhIG1hcmtldHBsYWNlIChlLmcgRG9vckRhc2gsIEdvb2dsZSBQbGF5IFN0b3JlKSBgcGF5bWVudF90ZXJtaW5hbGA6IGEgcG9pbnQtb2Ytc2FsZSBwYXltZW50IHRlcm1pbmFsIChlLmcgU3F1YXJlLCBUb2FzdCkgYGluY29tZV9zb3VyY2VgOiB0aGUgcGF5ZXIgaW4gYW4gaW5jb21lIHRyYW5zYWN0aW9uIChlLmcuLCBhbiBlbXBsb3llciwgY2xpZW50LCBvciBnb3Zlcm5tZW50IGFnZW5jeSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50ZXJwYXJ0eVR5cGUge1xuICAgIE1lcmNoYW50ID0gJ21lcmNoYW50JyxcbiAgICBGaW5hbmNpYWxJbnN0aXR1dGlvbiA9ICdmaW5hbmNpYWxfaW5zdGl0dXRpb24nLFxuICAgIFBheW1lbnRBcHAgPSAncGF5bWVudF9hcHAnLFxuICAgIE1hcmtldHBsYWNlID0gJ21hcmtldHBsYWNlJyxcbiAgICBQYXltZW50VGVybWluYWwgPSAncGF5bWVudF90ZXJtaW5hbCcsXG4gICAgSW5jb21lU291cmNlID0gJ2luY29tZV9zb3VyY2UnXG59XG5cbi8qKlxuICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50cnlDb2RlIHtcbiAgICBVcyA9ICdVUycsXG4gICAgR2IgPSAnR0InLFxuICAgIEVzID0gJ0VTJyxcbiAgICBObCA9ICdOTCcsXG4gICAgRnIgPSAnRlInLFxuICAgIEllID0gJ0lFJyxcbiAgICBDYSA9ICdDQScsXG4gICAgRGUgPSAnREUnLFxuICAgIEl0ID0gJ0lUJyxcbiAgICBQbCA9ICdQTCcsXG4gICAgRGsgPSAnREsnLFxuICAgIE5vID0gJ05PJyxcbiAgICBTZSA9ICdTRScsXG4gICAgRWUgPSAnRUUnLFxuICAgIEx0ID0gJ0xUJyxcbiAgICBMdiA9ICdMVicsXG4gICAgUHQgPSAnUFQnLFxuICAgIEJlID0gJ0JFJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIFBsYWlkIENoZWNrIEluY29tZSBJbnNpZ2h0cyBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgcmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIG9iamVjdCB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgSXRlbVxcJ3MgYmFuayBhY2NvdW50cyB0aGF0IGhhdmUgdGhlIHNlbGVjdGVkIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWV0YWRhdGE6IENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgZXh0cmFjdGVkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZXh0cmFjdGVkIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYm9udXMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHJlcHJlc2VudHMsIGlmIGl0IGlzIGEgYm9udXMuIGBCT05VU19JTkNMVURFRGA6IEJvbnVzIGlzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24gYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHBheSBgQk9OVVNfT05MWWA6IFRoaXMgdHJhbnNhY3Rpb24gaXMgYSBzdGFuZGFsb25lIGJvbnVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lQm9udXNUeXBlIHtcbiAgICBCb251c0luY2x1ZGVkID0gJ0JPTlVTX0lOQ0xVREVEJyxcbiAgICBCb251c09ubHkgPSAnQk9OVVNfT05MWScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZUNvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDUkFfSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdD86IENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggd2ViaG9va3Mgd2lsbCBiZSBzZW50IFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U/OiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmFpbGVkIHRvIGdlbmVyYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyYUJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIGJhbmsgaW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50czogQXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzOiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgd2l0aCB3aGljaCB0aGlzIGluY29tZSBzb3VyY2UgaXMgYXNzb2NpYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGVuZCB1c2Vy4oCZcyBuZXh0IHBheWNoZWNrIGZvciB0aGUgaW5jb21lIHNvdXJjZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3Rpb24gaW50ZXJ2YWwocykgZm9yIHRoZSBmb3JlY2FzdGVkIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUuXG4gICAgICogQHR5cGUge0FycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWVfcHJlZGljdGlvbl9pbnRlcnZhbHM6IEFycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBncm9zcyBtb250aGx5IGluY29tZSBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBuZXQgYW1vdW50IGFuZCBpbmNvbWUgY2F0ZWdvcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2dyb3NzX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBncm9zcyBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2FubnVhbF9ncm9zc19pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbm51YWwgaW5jb21lIGFtb3VudCBlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGF0YSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hbm51YWxfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYW5udWFsX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVCb251c1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGJvbnVzX3R5cGU/OiBDcmFCYW5rSW5jb21lQm9udXNUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlPzogQ3JhQmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBJREVOVElUWV9VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IGlkZW50aXR5IGZvciB0aGUgSXRlbSBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgdHJhbnNhY3Rpb25zIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIFJlcG9ydERlbGV0ZWQgPSAnUkVQT1JUX0RFTEVURUQnLFxuICAgIERhdGFVbmF2YWlsYWJsZSA9ICdEQVRBX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIENyYUJhc2VSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvYmFzZV9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIGRhdGEgZm9yIHRoZSBDUkEgQ2FzaGZsb3cgSW5zaWdodHMgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRDaGVja1Njb3JlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcGxhaWRfY2hlY2tfc2NvcmU/OiBQbGFpZENoZWNrU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2hmbG93IGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgaXMgYSBmbG9hdCwgaW50LCBvciBib29sZWFuLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogb2JqZWN0O1xufVxuLyoqXG4gKiBCYXNlUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBJRHMgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuIElmIG5vdCBwcm92aWRlZCwgYWxsIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB3aWxsIGJlIGluY2x1ZGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvYmFzZV9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEJhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEJhc2UgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxCYXNlUmVwb3J0V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBDYXNoZmxvdyBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIFBsYWlkIENoZWNrIHNjb3JlIHRvIHJldHVyblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBwbGFpZF9jaGVja19zY29yZV92ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY2FzaGZsb3dfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY2FzaGZsb3dfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNhc2hmbG93SW5zaWdodHNSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgYSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggd2ViaG9va3Mgd2lsbCBiZSBzZW50IFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgcmVwb3J0LiBEZWZhdWx0IHZhbHVlIGlzIDM2NTsgbWF4aW11bSBpcyA3MzE7IG1pbmltdW0gaXMgMTgwLiBJZiBhIHZhbHVlIGxvd2VyIHRoYW4gMTgwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMTgwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVpcmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCB3aWxsIGJlIGVhZ2VybHkgZ2VuZXJhdGVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlcG9ydC4gVGhlc2UgcHJvZHVjdHMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBiZWZvcmUgYSBzdWNjZXNzIHdlYmhvb2sgaXMgc2VudC4gVXNlIHRoaXMgb3B0aW9uIHRvIG1pbmltaXplIHJlc3BvbnNlIGxhdGVuY3kgZm9yIHByb2R1Y3QgYC9nZXRgIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhc2VfcmVwb3J0PzogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhc2hmbG93X2luc2lnaHRzPzogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFydG5lcl9pbnNpZ2h0cz86IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZTogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIENoZWNrIFJlcG9ydCBoYXMgZmFpbGVkIHRvIGdlbmVyYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ0hFQ0tfUkVQT1JUX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9pbmNvbWVfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQ3JhSW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19hdHRyaWJ1dGVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19hdHRyaWJ1dGVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTmV0d29ya0luc2lnaHRzUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIGluY2x1ZGUgb3RoZXIgcmVwb3J0cyBpbiB0aGUgUERGLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQREZBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8Q3JhUERGQWRkT25zPjtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgUGFydG5lciBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWZpYyBQcmlzbSBEYXRhIHByb2R1Y3RzIHRvIHJldHVybi4gSWYgbm9uZSBhcmUgcGFzc2VkIGluLCB0aGVuIGFsbCBwcm9kdWN0cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcmlzbVByb2R1Y3Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcmlzbV9wcm9kdWN0cz86IEFycmF5PFByaXNtUHJvZHVjdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9ucyB8IG51bGw7XG59XG4vKipcbiAqIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQ3JhUGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBDaGVjayBSZXBvcnQgYXJlIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB0aGUgcmVwb3J0IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHJldHJpZXZlIGZvciAyNCBob3Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGl0ZW1faWRzYCB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBDaGVjayBSZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0IGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ2hlY2sgSW5jb21lIEluc2lnaHRzIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpdGVtcz86IEFycmF5PENyYUJhbmtJbmNvbWVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyYUJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgb2JqZWN0IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4gYXBwbGljYXRpb24uICBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgYXBwbGljYXRpb25faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB0eXBlOiBDcmFMb2FuVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbkFwcGxpY2F0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdXNlciBhcHBsaWVkIGZvciB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBsb2FuIGFwcGxpY2F0aW9uXFwncyBkZWNpc2lvbiB3YXMgbWFkZS4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb25fZGF0ZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRlY2lzaW9uIG9mIHRoZSBsb2FuIGFwcGxpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhTG9hbkFwcGxpY2F0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCcsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXR1cyBhbmQgZGF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgbG9hbiB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5DbG9zZWRTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuQ2xvc2VkU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICAgICAqL1xuICAgIHN0YXR1czogQ3JhTG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgZWZmZWN0aXZlIGRhdGUgZm9yIHRoZSBzdGF0dXMgb2YgdGhlIGxvYW4uIFRoZSBkYXRlIHNob3VsZCBiZSBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5DbG9zZWRTdGF0dXNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0dXMgYW5kIGRhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGxvYW4gd2hlbiByZWdpc3RlcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbk9wZW5lZFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5PcGVuZWRTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbk9wZW5lZFN0YXR1c1xuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHBheW1lbnQgaW5mb3JtYXRpb24gZm9yIGEgbG9hbiBwYXltZW50IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblBheW1lbnRIaXN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggdG8gaWRlbnRpZnkgdGhlIGxvYW5cXCdzIHBheW1lbnQgcGVyaW9kLCBzdGFydGluZyBmcm9tIDEuIEZvciBleGFtcGxlOiAgIDEgbWVhbnMgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZSBsb2FuXFwncyBvcGVuaW5nIGRhdGUgYW5kIHRoZSAxc3QgcGF5bWVudCBkdWUgZGF0ZS4gICAyIG1lYW5zIHRoZSBwZXJpb2QgYmV0d2VlbiB0aGUgbG9hblxcJ3MgMXN0IHBheW1lbnQgZHVlIGRhdGUgYW5kIDJuZCBwYXltZW50IGR1ZSBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIHBlcmlvZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGR1ZSBkYXRlIG9yIGVuZCBkYXRlIG9mIHRoZSBwYXltZW50IHBlcmlvZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgZHVlX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgdGhlIGxvYW4gd2FzIGRlbGlucXVlbnQgYXQgdGhlIGVuZCBvZiB0aGUgcGF5IHBlcmlvZC4gSWYgc3BlY2lmaWVkLCBzaG91bGQgYmUgZ3JlYXRlciBvZiBlcXVhbCB0byAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIGRheXNfcGFzdF9kdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHBhc3QgZHVlIG9yIHRoZSBjaGFyZ2Utb2ZmIGFtb3VudCBvZiB0aGUgbG9hbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXltZW50IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBhbW91bnRfcGFzdF9kdWU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbGFuY2UgcmVtYWluaW5nIG9uIHRoZSBsb2FuIGF0IHRoZSBlbmQgb2YgdGhlIHBheW1lbnQgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIGJhbGFuY2VfcmVtYWluaW5nPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIGEgbG9hblxcJ3MgcGF5bWVudCBzY2hlZHVsZS4gYEJJV0VFS0xZYCByZXByZXNlbnRzIG9uZSBwYXltZW50IGV2ZXJ5IHR3byB3ZWVrcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5QYXltZW50U2NoZWR1bGUge1xuICAgIERhaWx5ID0gJ0RBSUxZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBRdWFydGVybHkgPSAnUVVBUlRFUkxZJyxcbiAgICBBbm51YWxseSA9ICdBTk5VQUxMWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIHRvIHJlZ2lzdGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuUmVnaXN0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuUmVnaXN0ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGZvciB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiAgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGxvYW5faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuUGF5bWVudFNjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3NjaGVkdWxlOiBDcmFMb2FuUGF5bWVudFNjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSBsb2FuIGFjY291bnQgd2FzIG9wZW5lZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbk9wZW5lZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX3dpdGhfc3RhdHVzOiBDcmFMb2FuT3BlbmVkU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIGFwcHJvdmVkIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgbG9hbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbj86IENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEgdG8gcmVnaXN0ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuIGFwcGxpY2F0aW9uLiAgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGFwcGxpY2F0aW9uX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB1c2VyIGFwcGxpZWQgZm9yIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2RhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnLFxuICAgIEJvb2tlZCA9ICdCT09LRUQnLFxuICAgIEN1cnJlbnQgPSAnQ1VSUkVOVCcsXG4gICAgRGVsaW5xdWVudCA9ICdERUxJTlFVRU5UJyxcbiAgICBEZWZhdWx0ID0gJ0RFRkFVTFQnLFxuICAgIENoYXJnZWRPZmYgPSAnQ0hBUkdFRF9PRkYnLFxuICAgIFRyYW5zZmVycmVkID0gJ1RSQU5TRkVSUkVEJyxcbiAgICBQYWlkT2ZmID0gJ1BBSURfT0ZGJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgc3RhdHVzIGFuZCBkYXRlIG9mIGFuIHVwZGF0ZSB0byB0aGUgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5TdGF0dXNIaXN0b3J5VXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGxvYW4gdGhlIHVzZXIgYXBwbGllZCBmb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuVHlwZSB7XG4gICAgUGVyc29uYWwgPSAnUEVSU09OQUwnLFxuICAgIENyZWRpdENhcmQgPSAnQ1JFRElUX0NBUkQnLFxuICAgIEJ1c2luZXNzID0gJ0JVU0lORVNTJyxcbiAgICBNb3J0Z2FnZSA9ICdNT1JUR0FHRScsXG4gICAgQXV0byA9ICdBVVRPJyxcbiAgICBQYXlkYXkgPSAnUEFZREFZJyxcbiAgICBTdHVkZW50ID0gJ1NUVURFTlQnLFxuICAgIEhvbWVFcXVpdHkgPSAnSE9NRV9FUVVJVFknLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGxvYW4gZGF0YSBmb3IgdGhlIGxvYW4gYmVpbmcgdW5yZWdpc3RlcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuVW5yZWdpc3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9hbi4gIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBsb2FuX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVW5yZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbkNsb3NlZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBjbG9zZWRfd2l0aF9zdGF0dXM6IENyYUxvYW5DbG9zZWRTdGF0dXM7XG59XG4vKipcbiAqIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblVucmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGRhdGEgdG8gdXBkYXRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuVXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4uICBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVwZGF0ZVxuICAgICAqL1xuICAgIGxvYW5faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0YXR1cyB1cGRhdGUgaGlzdG9yeSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzX2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIHVwZGF0ZXMgdG8gdGhlIHBheW1lbnQgaGlzdG9yeSBmb3IgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge0FycmF5PENyYUxvYW5QYXltZW50SGlzdG9yeT59XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VcGRhdGVcbiAgICAgKi9cbiAgICBwYXltZW50X2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuUGF5bWVudEhpc3Rvcnk+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGxvYW4gYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q3JhTG9hbkFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy9yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdW5yZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblVucmVnaXN0ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VbnJlZ2lzdGVyPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdXBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuVXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VcGRhdGU+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlOiBNb25pdG9yaW5nQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYGNyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGEgVXNlciBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2luc2lnaHRzX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgTW9uaXRvcmluZyBJbnNpZ2h0cyBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIE1vbml0b3JpbmcgSW5zaWdodHMgSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgc3BlY2lmaWMgaW5zaWdodHMgd2VyZSBnZW5lcmF0ZWQgKHBlci1pdGVtKSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnNpZ2h0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc2lnaHRzOiBNb25pdG9yaW5nSW5zaWdodHMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL3N1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBNb25pdG9yaW5nIEluc2lnaHRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgTW9uaXRvcmluZyBJbnNpZ2h0cyBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3Vic2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdWJzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgY3JhL21vbml0b3JpbmdfaW5zaWdodHMvdW5zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgbmV0d29yayBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBuZXR3b3JrX2F0dHJpYnV0ZXM6IG9iamVjdDtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbXMgdGhlIGVuZCB1c2VyIGNvbm5lY3RlZCBpbiBMaW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFOZXR3b3JrSW5zaWdodHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgUERGLiAgYGNyYV9pbmNvbWVfaW5zaWdodHNgOiBJbmNsdWRlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgaW4gdGhlIFBERi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBERkFkZE9ucyB7XG4gICAgQ3JhSW5jb21lSW5zaWdodHMgPSAnY3JhX2luY29tZV9pbnNpZ2h0cydcbn1cblxuLyoqXG4gKiBUaGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgb2YgdGhlIGJhbmsgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIFBhcnRuZXIgSW5zaWdodHMgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNQcmlzbX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc20/OiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyB1c2VkIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwYXJ0bmVyIGluc2lnaHRzIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9JTlNJR0hUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUl9JTlNJR0hUU19DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBhcnRuZXIgaW5zaWdodHMgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOU0lHSFRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSX0lOU0lHSFRTX0VSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGF0IHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGluIHRoZSBpdGVtXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnQ+O1xufVxuLyoqXG4gKiBBY2NvdW50IGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgaXRlbSBmcm9tIHdoaWNoIFBhcnRuZXIgSW5zaWdodHMgd2VyZSBnZW5lcmF0ZWQgZnJvbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBQcmlzbSBEYXRhIGluc2lnaHRzIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgY2FzaF9zY29yZT86IFByaXNtQ2FzaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21GaXJzdERldGVjdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBmaXJzdF9kZXRlY3Q/OiBQcmlzbUZpcnN0RGV0ZWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHdoZXRoZXIgdGhlIFByaXNtIERhdGEgYXR0cmlidXRlcyBzdWNjZWVkZWQgb3IgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJlZGljdGlvbiBpbnRlcnZhbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgcHJlZGljdGVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHByb2JhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICAgICAqL1xuICAgIGxvd2VyX2JvdW5kPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHByZWRpY3RlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBwcm9iYWJpbGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1cHBlcl9ib3VuZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBmYWxsaW5nIHdpdGhpbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kLiBUaGlzIGlzIGEgcGVyY2VudGFnZSByZXByZXNlbnRlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICBwcm9iYWJpbGl0eT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBDaGVjayBSZXBvcnQgdXBncmFkZSBhdHRlbXB0IGhhcyBmYWlsZWRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFVcGdyYWRlRmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVUEdSQURFX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVVwZ3JhZGVGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgZm9yIGl0ZW1zIHRoYXQgZmFpbGVkIHRvIGJlIHVwZ3JhZGVkIGJ5IGEgQ2hlY2sgUmVwb3J0IHVwZ3JhZGUgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIDEwOTkgdGF4IGZvcm1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTkge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9ybTEwOTlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZm9ybV8xMDk5X3R5cGU/OiBGb3JtMTA5OVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBDcmVkaXQxMDk5UmVjaXBpZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5UGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcj86IENyZWRpdDEwOTlQYXllcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OUZpbGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlsZXI/OiBDcmVkaXQxMDk5RmlsZXI7XG4gICAgLyoqXG4gICAgICogVGF4IHllYXIgb2YgdGhlIHRheCBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIHJlbnQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcm95YWx0aWVzIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByb3lhbHRpZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBvdGhlciBpbmNvbWUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG90aGVyX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmaXNoaW5nIGJvYXQgcHJvY2VlZHMgZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlzaGluZ19ib2F0X3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbWVkaWNhbCBhbmQgaGVhbHRoY2FyZSBwYXltZW50cyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtZWRpY2FsX2FuZF9oZWFsdGhjYXJlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygbm9uZW1wbG95ZWUgY29tcGVuc2F0aW9uIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vbmVtcGxveWVlX2NvbXBlbnNhdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN1YnN0aXR1dGUgcGF5bWVudHMgbWFkZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3Vic3RpdHV0ZV9wYXltZW50c19pbl9saWV1X29mX2RpdmlkZW5kc19vcl9pbnRlcmVzdD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgcGF5ZXIgbWFkZSBkaXJlY3Qgc2FsZXMgb3ZlciAkNTAwMCBvZiBjb25zdW1lciBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfbWFkZV9kaXJlY3Rfc2FsZXNfb2ZfNTAwMF9vcl9tb3JlX29mX2NvbnN1bWVyX3Byb2R1Y3RzX3RvX2J1eWVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgY3JvcCBpbnN1cmFuY2UgcHJvY2VlZHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGNyb3BfaW5zdXJhbmNlX3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ29sZGVuIHBhcmFjaHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBleGNlc3NfZ29sZGVuX3BhcmFjaHV0ZV9wYXltZW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGdyb3NzIHByb2NlZWRzIHBhaWQgdG8gYW4gYXR0b3JuZXkgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX3Byb2NlZWRzX3BhaWRfdG9fYW5fYXR0b3JuZXk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGRlZmVycmFscyBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9kZWZlcnJhbHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGluY29tZSBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBzdGF0ZSB0YXggd2l0aGhlbGQgb2YgcGF5ZXIgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV90YXhfd2l0aGhlbGRfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9zdGF0ZV9udW1iZXJfbG93ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgcmVwb3J0ZWQgZm9yIHNlY29uZGFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX2xvd2VyPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkIFBheW1lbnQgY2FyZCBUaGlyZCBwYXJ0eSBuZXR3b3JrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19yZXBvcnRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgUFNFIChQYXltZW50IFNldHRsZW1lbnQgRW50aXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHNlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCAoWFhYKSBYWFgtWFhYWC4gUGhvbmUgbnVtYmVyIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgYW1vdW50IHJlcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBncm9zc19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBjYXJkIG5vdCBwcmVzZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY2FyZF9ub3RfcHJlc2VudF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lcmNoYW50X2NhdGVnb3J5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfcGF5bWVudF90cmFuc2FjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSmFudWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgamFudWFyeV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgRmVicnVhcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlYnJ1YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXJjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWFyY2hfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEFwcmlsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhcHJpbF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTWF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bmVfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bHlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEF1Z3VzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgYXVndXN0X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBTZXB0ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlcHRlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgT2N0b2Jlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb2N0b2Jlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTm92ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vdmVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBEZWNlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZGVjZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIG9mIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSB0YXggcmVwb3J0ZWQgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlciB1c2VkIGJ5IDEwOTktSyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkOiBQYXltZW50IFNldHRsZW1lbnQgRW50aXR5IChQU0UpLCBFbGVjdHJvbmljIFBheW1lbnQgRmFjaWxpdGF0b3IgKEVQRiksIE90aGVyIFRoaXJkIFBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXllciB1c2VkIGJ5IDEwOTktTUlTQyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbGVwaG9uZSBudW1iZXIgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZWNpcGllbnQgdXNlZCBpbiBib3RoIDEwOTktSyBhbmQgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRheCBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaGVja2VkIGlmIEZBQ1RBIGlzIGEgZmlsaW5nIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmYWN0YV9maWxpbmdfcmVxdWlyZW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgMm5kIFRJTiBleGlzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHNlY29uZF90aW5fZXhpc3RzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGNyZWRpdCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWNyZWRpdCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBY2NvdW50U3VidHlwZSB7XG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBUaGlzIGNvbnRhaW5zIGFuIGFtb3VudCwgZGVub21pbmF0ZWQgaW4gdGhlIGN1cnJlbmN5IHNwZWNpZmllZCBieSBlaXRoZXIgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3kge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuczsgY2FuIGluY2x1ZGUgYXQgbW9zdCBvbmUgVk9BL3N0YW5kYXJkIEFzc2V0IFJlcG9ydCB0b2tlbnMgYW5kIG9uZSBWT0UgQXNzZXQgUmVwb3J0IFRva2VuLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciwgd2hpY2ggYWxsb3dzIHRoZW0gdG8gZmV0Y2ggdGhlIEFzc2V0IFJlcG9ydHMgYXR0YWNoZWQgdG8gdGhlIHRva2VuLiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRva2VucyB3aGljaCB0aGUgc3BlY2lmaWVkIEF1ZGl0IENvcHkgVG9rZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGguIFRoZSB0eXBlcyBvZiB0b2tlbiBzdXBwb3J0ZWQgYXJlIGFzc2V0IHJlcG9ydCB0b2tlbiBhbmQgZW1wbG95bWVudCByZXBvcnQgdG9rZW4uIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDEgb2YgZWFjaCB0b2tlbiB0eXBlIGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSBUb2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEJhbmtFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBsYXRlc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGRlcG9zaXQgZnJvbSB0aGlzIGVtcGxveWVyIGZyb20gd2l0aGluIHRoZSBwZXJpb2Qgb2YgdGhlIGRheXMgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZWFybGllc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEJhbmsgRW1wbG95bWVudCBkYXRhLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIGEgZGlzdGluY3QgYmFuayBlbXBsb3ltZW50IHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydHM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBkaWZmZXJlbnQgZW1wbG95ZXIgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBFbXBsb3ltZW50IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2FjY291bnRzOiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG59XG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0IHdhcyBnZW5lcmF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEVtcGxveW1lbnQgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19FTVBMT1lNRU5UX1dBUk5JTkdgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZSB7XG4gICAgQmFua0VtcGxveW1lbnRXYXJuaW5nID0gJ0JBTktfRU1QTE9ZTUVOVF9XQVJOSU5HJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgaXRlbXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUaGUgYWNjb3VudCB0eXBlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGBkZXBvc2l0b3J5YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZSB7XG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5J1xufVxuXG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkuICBgQkFOS19JTlRFUkVTVGA6IEludGVyZXN0IGVhcm5lZCBmcm9tIGEgYmFuayBhY2NvdW50LiBgQkVORUZJVF9PVEhFUmA6IEdvdmVybm1lbnQgYmVuZWZpdHMgb3RoZXIgdGhhbiByZXRpcmVtZW50LCB1bmVtcGxveW1lbnQsIGNoaWxkIHN1cHBvcnQsIG9yIGRpc2FiaWxpdHkuIEN1cnJlbnRseSB1c2VkIG9ubHkgaW4gdGhlIFVLLCB0byByZXByZXNlbnQgYmVuZWZpdHMgc3VjaCBhcyBDb3N0IG9mIExpdmluZyBQYXltZW50cy4gYENBU0hgOiBEZXByZWNhdGVkIGFuZCB1c2VkIG9ubHkgZm9yIGV4aXN0aW5nIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbnMuIEhhcyBiZWVuIHJlcGxhY2VkIGJ5IGBDQVNIX0RFUE9TSVRgIGFuZCBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmAuIGBDQVNIX0RFUE9TSVRgOiBBIGNhc2ggb3IgY2hlY2sgZGVwb3NpdC4gYENISUxEX1NVUFBPUlRgOiBDaGlsZCBzdXBwb3J0IHBheW1lbnRzIHJlY2VpdmVkLiBgR0lHX0VDT05PTVlgOiBJbmNvbWUgZWFybmVkIGFzIGEgZ2lnIGVjb25vbXkgd29ya2VyLCBlLmcuIGRyaXZpbmcgZm9yIFViZXIsIEx5ZnQsIFBvc3RtYXRlcywgRG9vckRhc2gsIGV0Yy4gYExPTkdfVEVSTV9ESVNBQklMSVRZYDogRGlzYWJpbGl0eSBwYXltZW50cywgaW5jbHVkaW5nIFNvY2lhbCBTZWN1cml0eSBkaXNhYmlsaXR5IGJlbmVmaXRzLiBgT1RIRVJgOiBJbmNvbWUgdGhhdCBjb3VsZCBub3QgYmUgY2F0ZWdvcml6ZWQgYXMgYW55IG90aGVyIGluY29tZSBjYXRlZ29yeS4gYE1JTElUQVJZYDogVmV0ZXJhbnMgYmVuZWZpdHMuIEluY29tZSBlYXJuZWQgYXMgc2FsYXJ5IGZvciBzZXJ2aW5nIGluIHRoZSBtaWxpdGFyeSAoZS5nLiB0aHJvdWdoIERGQVMpIHdpbGwgYmUgY2xhc3NpZmllZCBhcyBgU0FMQVJZYCByYXRoZXIgdGhhbiBgTUlMSVRBUllgLiAgYFJFTlRBTGA6IEluY29tZSBlYXJuZWQgZnJvbSBhIHJlbnRhbCBwcm9wZXJ0eS4gSW5jb21lIG1heSBiZSBpZGVudGlmaWVkIGFzIHJlbnRhbCB3aGVuIHRoZSBwYXltZW50IGlzIHJlY2VpdmVkIHRocm91Z2ggYSByZW50YWwgcGxhdGZvcm0sIGUuZy4gQWlyYm5iOyByZW50IHBhaWQgZGlyZWN0bHkgYnkgdGhlIHRlbmFudCB0byB0aGUgcHJvcGVydHkgb3duZXIgKGUuZy4gdmlhIGNhc2gsIGNoZWNrLCBvciBBQ0gpIHdpbGwgdHlwaWNhbGx5IG5vdCBiZSBjbGFzc2lmaWVkIGFzIHJlbnRhbCBpbmNvbWUuICBgUkVUSVJFTUVOVGA6IFBheW1lbnRzIGZyb20gcHJpdmF0ZSByZXRpcmVtZW50IHN5c3RlbXMsIHBlbnNpb25zLCBhbmQgZ292ZXJubWVudCByZXRpcmVtZW50IHByb2dyYW1zLCBpbmNsdWRpbmcgU29jaWFsIFNlY3VyaXR5IHJldGlyZW1lbnQgYmVuZWZpdHMuIGBTQUxBUllgOiBQYXltZW50IGZyb20gYW4gZW1wbG95ZXIgdG8gYW4gZWFybmVyIG9yIG90aGVyIGZvcm0gb2YgcGVybWFuZW50IGVtcGxveW1lbnQuIGBUQVhfUkVGVU5EYDogQSB0YXggcmVmdW5kLiBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmA6IERlcG9zaXRzIGZyb20gYSBtb25leSB0cmFuc2ZlciBhcHAsIHN1Y2ggYXMgVmVubW8sIENhc2ggQXBwLCBvciBaZWxsZS4gYFVORU1QTE9ZTUVOVGA6IFVuZW1wbG95bWVudCBiZW5lZml0cy4gSW4gdGhlIFVLLCBpbmNsdWRlcyBjZXJ0YWluIGxvdy1pbmNvbWUgYmVuZWZpdHMgc3VjaCBhcyB0aGUgVW5pdmVyc2FsIENyZWRpdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3YXJuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlIHtcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gICAgSW5zdWZmaWNpZW50Q3JlZGVudGlhbHMgPSAnSU5TVUZGSUNJRU5UX0NSRURFTlRJQUxTJyxcbiAgICBJdGVtTG9ja2VkID0gJ0lURU1fTE9DS0VEJyxcbiAgICBVc2VyU2V0dXBSZXF1aXJlZCA9ICdVU0VSX1NFVFVQX1JFUVVJUkVEJyxcbiAgICBDb3VudHJ5Tm90U3VwcG9ydGVkID0gJ0NPVU5UUllfTk9UX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Eb3duID0gJ0lOU1RJVFVUSU9OX0RPV04nLFxuICAgIEluc3RpdHV0aW9uTm9Mb25nZXJTdXBwb3J0ZWQgPSAnSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Ob3RSZXNwb25kaW5nID0gJ0lOU1RJVFVUSU9OX05PVF9SRVNQT05ESU5HJyxcbiAgICBJbnZhbGlkQ3JlZGVudGlhbHMgPSAnSU5WQUxJRF9DUkVERU5USUFMUycsXG4gICAgSW52YWxpZE1mYSA9ICdJTlZBTElEX01GQScsXG4gICAgSW52YWxpZFNlbmRNZXRob2QgPSAnSU5WQUxJRF9TRU5EX01FVEhPRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgTWZhTm90U3VwcG9ydGVkID0gJ01GQV9OT1RfU1VQUE9SVEVEJyxcbiAgICBOb0FjY291bnRzID0gJ05PX0FDQ09VTlRTJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgQWNjZXNzTm90R3JhbnRlZCA9ICdBQ0NFU1NfTk9UX0dSQU5URUQnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBCYW5rIEluY29tZSBSZXBvcnRzIHNob3VsZCBiZSBmZXRjaGVkLiBNdWx0aXBsZSByZXBvcnRzIG1heSBiZSBhdmFpbGFibGUgaWYgdGhlIHJlcG9ydCBoYXMgYmVlbiByZS1jcmVhdGVkIG9yIHJlZnJlc2hlZC4gSWYgbW9yZSB0aGFuIG9uZSByZXBvcnQgaXMgYXZhaWxhYmxlLCB0aGUgbW9zdCByZWNlbnQgcmVwb3J0cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgSW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50cz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc291cmNlcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVTb3VyY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluY29tZSBwYXkgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeSB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgZGF5cyBvZiBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIHJlZnJlc2guIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB0aGUgbW9zdCByZWNlbnRseSBnZW5lcmF0ZWQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluY29tZSBzb3VyY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBpbiB0aGUgdXNlcuKAmXMgYmFuayBhY2NvdW50IGZvciB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgZm9yIHRoZSBpbmNvbWUgc291cmNlIHdpdGhpbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFN1bW1hcnkgZm9yIGJhbmsgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBtYXkgcmV0dXJuIGFuIGluY29ycmVjdCB2YWx1ZSBpZiB0aGUgc3VtbWFyeSBpbmNsdWRlcyBpbmNvbWUgc291cmNlcyBpbiBtdWx0aXBsZSBjdXJyZW5jaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFRoZSB0cmFuc2FjdGlvbnMgZGF0YSBmb3IgdGhlIGVuZCB1c2VyXFwncyBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3kgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBjcmVkaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50LCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYElURU1fVU5BUFBST1ZFRGA6IFVzZXIgZXhpdGVkIGZsb3cgYmVmb3JlIGdpdmluZyBwZXJtaXNzaW9uIHRvIHNoYXJlIGRhdGEgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgSXRlbVVuYXBwcm92ZWQgPSAnSVRFTV9VTkFQUFJPVkVEJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0lOQ09NRV9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZSB7XG4gICAgQmFua0luY29tZVdhcm5pbmcgPSAnQkFOS19JTkNPTUVfV0FSTklORydcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kaW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN0YXRlbWVudCB1cGxvYWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB3aG9zZSBiYW5rIHN0YXRlbWVudHMgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LiBBUFIgaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGJ5IGFsbCBjYXJkIGlzc3VlcnM7IGlmIEFQUiBkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QVBSPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFwcnM6IEFycmF5PEFQUj47XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG93ZWQgYXMgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGlzc3VlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBjcmVkaXQgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgY3N2IGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGNyZWRpdCBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBQQVlTVFVCYDogQSBwYXlzdHViLiAgYEJBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBVU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYFVTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfTEVTYDogQSBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBHSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBQTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBOT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBVUkwgdG8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgZmlsZS4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgZmlsZSB0eXBlIHdpbGwgYWx3YXlzIGJlIFBERiwgYW5kIHRoZSBmaWxlIG1heSBub3QgYmUgYXZhaWxhYmxlLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYC4gSWYgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZ2VuZXJhdGUgYSBQREYgaWYgdGhlIG9yaWdpbmFsIGlzIG5vdCBhdmFpbGFibGUsIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIFtFeGFtcGxlIGdlbmVyYXRlZCBwYXkgc3R1Yl0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3VtZW50cy9wbGFpZC1nZW5lcmF0ZWQtbW9jay1wYXlzdHViLnBkZikuICBGb3IgRG9jdW1lbnQgSW5jb21lLCB0aGlzIGZpZWxkIHdpbGwgbm90IGJlIGBudWxsYCwgYW5kIHRoZSBmaWxlIHR5cGUgd2lsbCBiZSB0aGUgb3JpZ2luYWwgZmlsZSB0eXBlIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLiBGb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBmaWxlIHR5cGVzLCBzZWUgdGhlIFtEb2N1bWVudCBJbmNvbWVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2luY29tZS9wYXlyb2xsLWluY29tZSkgZG9jdW1lbnRhdGlvbi4gIFRoaXMgZG93bmxvYWQgVVJMIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBhbmQgZXhwaXJlcyBhZnRlciB0d28gbWludXRlcy4gVG8gZ2VuZXJhdGUgYSBuZXcgZG93bmxvYWQgVVJMLCBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgYWdhaW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvd25sb2FkX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudCAoaWYgYXZhaWxhYmxlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aHkgYSBmYWlsdXJlIG9jY3VycmVkIGR1cmluZyBkb2N1bWVudCBwcm9jZXNzaW5nIChpZiBhdmFpbGFibGUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbXBsb3ltZW50IGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveW1lbnQgaXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRva2VuIHRvIHJlcHJlc2VudCB0aGUgdW5kZXJseWluZyBFbXBsb3ltZW50IGRhdGFcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZCBvZiBlbXBsb3ltZW50LCBpZiBhcHBsaWNhYmxlLiBQcm92aWRlZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGxhdGZvcm1JZHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwbGF0Zm9ybV9pZHM6IENyZWRpdFBsYXRmb3JtSWRzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGVtcGxveW1lbnQgZm9yIHRoZSBpbmRpdmlkdWFsLiBgXFxcIkZVTExfVElNRVxcXCJgOiBBIGZ1bGwtdGltZSBlbXBsb3llZS4gYFxcXCJQQVJUX1RJTUVcXFwiYDogQSBwYXJ0LXRpbWUgZW1wbG95ZWUuIGBcXFwiQ09OVFJBQ1RPUlxcXCJgOiBBbiBlbXBsb3llZSB0eXBpY2FsbHkgaGlyZWQgZXh0ZXJuYWxseSB0aHJvdWdoIGEgY29udHJhY3RpbmcgZ3JvdXAuIGBcXFwiVEVNUE9SQVJZXFxcImA6IEEgdGVtcG9yYXJ5IGVtcGxveWVlLiBgXFxcIk9USEVSXFxcImA6IFRoZSBlbXBsb3llZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgdHlwZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVlX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVtcGxveWVlXFwncyBtb3N0IHJlY2VudCBwYXlzdHViIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGxhc3RfcGF5c3R1Yl9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfT1dORVJTOiBBc3NldE93bmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0hPTERFUjogQXNzZXRIb2xkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05TOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZhbGlkYXRpb25Tb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nLi4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFVEFJTDogQXNzZXRUcmFuc2FjdGlvbkRldGFpbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTjogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRzIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIEZpcnN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTWlkZGxlTmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycztcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGxvYW4uIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBcXFwiU3ViamVjdExvYW5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMb2FuUm9sZVR5cGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PExvYW5JZGVudGlmaWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogQXJyYXk8TG9hbklkZW50aWZpZXI+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbG9hbnMgdGhhdCBhcmUgcGFydCBvZiBhIHNpbmdsZSBkZWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zXG4gICAgICovXG4gICAgTE9BTjogQ3JlZGl0RnJlZGRpZU1hY0xvYW47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGFydHkgdG8gYSB0cmFuc2FjdGlvbi4gSW5jbHVkZWQgZGlyZWN0IHBhcnRpY2lwYW50cyBsaWtlIHRoZSBib3Jyb3dlciBhbmQgc2VsbGVyIGFzIHdlbGwgYXMgaW5kaXJlY3QgcGFydGljaXBhbnRzIHN1Y2ggYXMgdGhlIGZsb29kIGNlcnRpZmljYXRlIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gICAgICovXG4gICAgUk9MRVM6IFJvbGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbFxuICAgICAqL1xuICAgIE5BTUU6IENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydERhdGVUaW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJSZXBvcnRJRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRJZGVudGlmaWVyVHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25QYXJlbnRJZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXI6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChWT0EpIHNjaGVtYSB2ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdGF0dXNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBTVEFUVVNFUzogU3RhdHVzZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVzY3JpYmUgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBmb3Igc2VydmljZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAgICAgKi9cbiAgICBTRVJWSUNFOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFNFUlZJQ0VfUFJPRFVDVF9GVUxGSUxMTUVOVDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjQXNzZXRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIHNjaGVtYS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBMT0FOUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydGllc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFBBUlRJRVM6IENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBTRVJWSUNFUzogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVuZCB1c2VyXFwncyBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhOiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogQ3JlZGl0UGF5U3R1YkVhcm5pbmdzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogQ3JlZGl0UGF5U3R1YkVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0UGF5U3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViTmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgbmV0X3BheTogQ3JlZGl0UGF5U3R1Yk5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YlBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM6IFBheVN0dWJQYXlQZXJpb2REZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkRlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogUGF5U3R1YkRlZHVjdGlvbnNUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5IHN0dWIgYW5kIHRoZSB0b3RhbCBlYXJuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViRWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJFYXJuaW5nc1RvdGFsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgU0lOR0xFYCBvciBgTUFSUklFRGAgb3IgYE5PVCBMSVNURURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViVGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ6IFBheVN0dWJUYXhwYXllcklEO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzczogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgbmV0IHBheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGV4cGxpY2l0IHBheSBiYXNpcyBvbiB0aGUgcGF5c3R1YiAoaWYgcHJlc2VudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlIHtcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBIb3VybHkgPSAnSE9VUkxZJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nXG59XG5cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIHdob3NlIHBheXJvbGwgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBib2R5IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PFBheXJvbGxJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2RvY3VtZW50cy91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZG9jdW1lbnRzL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyBiZWxvbmdpbmcgdG8gdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoZSBJdGVtcyBzcGVjaWZpZWQgaGVyZSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgcHJvdmlkaW5nIHRoZW0gaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIHRoZXNlIEl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggKGFuZCBiaWxsZWQgZm9yKSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luc3RpdHV0aW9uPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlkZW5jZTogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB0byBiZSByZWZyZXNoZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHdoZXJlIFBsYWlkIHdpbGwgc2VuZCB0aGUgcGF5cm9sbCBpbmNvbWUgcmVmcmVzaCB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJVU0VSX1BSRVNFTkNFX1JFUVVJUkVEXFxcImAgVXNlciBwcmVzZW5jZSBpcyByZXF1aXJlZCB0byByZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb24uIGBcXFwiU1VDQ0VTU0ZVTFxcXCJgIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggd2FzIHN1Y2Nlc3NmdWwuIGBcXFwiTk9UX0ZPVU5EXFxcImAgTm8gbmV3IGRhdGEgd2FzIGZvdW5kIGFmdGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yZWZyZXNoX3N0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbFJpc2tTaWduYWxzSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgZW1wbG95ZWVfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcG9zaXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiByZXBvcnQgdG9rZW4gc3RyaW5ncywgd2l0aCBhdCBtb3N0IG9uZSB0b2tlbiBvZiBlYWNoIHJlcG9ydCB0eXBlLiBDdXJyZW50bHkgb25seSBBc3NldCBSZXBvcnQgdG9rZW4gaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2Vjb25kYXJ5X2NsaWVudF9pZGAgaXMgdGhlIGNsaWVudCBpZCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSByZWxheSB0b2tlbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCB3ZWJob29rcyB3aGVuIHRoZSBTZWNvbmRhcnkgQ2xpZW50IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSB0byBhbGxvdyB0aGVtIHRvIGFjY2VzcyB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgeW91IHdvdWxkIGxpa2UgdG8gcmV2b2tlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIHJlbGF5IHRva2VuIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFuZCByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgcmV0dXJuZWQgaW4gdGhlIG9uU3VjY2Vzcy9vbkV4aXQgY2FsbGJhY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTGluayBzZXNzaW9uIHN0YXJ0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgc2Vzc2lvbl9zdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uUmVzdWx0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBDcmVkaXRTZXNzaW9uUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgZW1wbG95bWVudC4gIGBOT19FTVBMT1lNRU5UU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGVtcGxveW1lbnQgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYEVNUExPWUVSX05PVF9MSVNURURgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZGlkIG5vdCBzZWUgdGhlaXIgY3VycmVudCBvciBwcmV2aW91cyBlbXBsb3llciBpbiB0aGUgbGlzdCBvZiBlbXBsb3llciBuYW1lcyBmb3VuZC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9FbXBsb3llcnNGb3VuZCA9ICdOT19FTVBMT1lFUlNfRk9VTkQnLFxuICAgIEVtcGxveWVyTm90TGlzdGVkID0gJ0VNUExPWUVSX05PVF9MSVNURUQnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgSW5jb21lIExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBpbmNvbWUgIGBOT19ERVBPU0lUU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgVVNFUl9SRVBPUlRFRF9OT19JTkNPTUVgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZG9uXFwndCByZWNlaXZlIGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgU1RBUlRFRGA6IFRoZSB1c2VyIGJlZ2FuIHRoZSBiYW5rIGluY29tZSBwb3J0aW9uIG9mIHRoZSBsaW5rIGZsb3cuICBgSU5URVJOQUxfRVJST1JgOiBUaGUgdXNlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9EZXBvc2l0c0ZvdW5kID0gJ05PX0RFUE9TSVRTX0ZPVU5EJyxcbiAgICBVc2VyUmVwb3J0ZWROb0luY29tZSA9ICdVU0VSX1JFUE9SVEVEX05PX0lOQ09NRSdcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIDEwOTlzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtXzEwOTlzX3VwbG9hZGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgTGluayBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yIHtcbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5lZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHcycyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEluc3RpdHV0aW9uIE5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNldCBvZiByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBpdGVtX2FkZF9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWVfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGRvY3VtZW50X2luY29tZV9yZXN1bHRzPzogQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIGZvciB0aGUgdXNlci4gU2Vzc2lvbnMgd2lsbCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlc3Npb25zPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0VzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCB5ZWFyIG9mIHRoZSBXMiBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRheF95ZWFyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIG1lZGljYXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfd2FnZXNfYW5kX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlZCB0aXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYWxsb2NhdGVkX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfOTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5vbnF1YWxpZmllZCBwbGFucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG5vbnF1YWxpZmllZF9wbGFuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94XzEyOiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgcmV0aXJlbWVudF9wbGFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXRlX2FuZF9sb2NhbF93YWdlczogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0LiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHRpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdGVkIGxpa2VsaWhvb2QgdGhhdCB0aGUgdHJhbnNhY3Rpb24sIGlmIGluaXRpYXRlZCwgd2lsbCBiZSBzdWJqZWN0IHRvIGEgcmV0dXJuLiAgSW4gdGhlIGBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGZpdmUgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAwJSAtIDAuMDIlICAgMjogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAyJSAtIDAuMDUlICAgMzogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjA1JSAtIDAuMSUgICA0OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMSUgLSAwLjUlICAgNTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDAuNSUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIEFjY291bnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgdGVhbSBtZW1iZXIgd2l0aCBhY2Nlc3MgdG8gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXIge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBkYXNoYm9hcmQgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBEYXNoYm9hcmRVc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGRhc2hib2FyZCB1c2Vyc1xuICAgICAqIEB0eXBlIHtBcnJheTxEYXNoYm9hcmRVc2VyPn1cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyczogQXJyYXk8RGFzaGJvYXJkVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRGFzaGJvYXJkVXNlclN0YXR1cyB7XG4gICAgSW52aXRlZCA9ICdpbnZpdGVkJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBEZWFjdGl2YXRlZCA9ICdkZWFjdGl2YXRlZCdcbn1cblxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBzb3VyY2Ugb2YgZGF0YSBmb3IgYSBnaXZlbiBwcm9kdWN0L2RhdGEgdHlwZS4gIGBJTlNUSVRVVElPTmA6IFRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyB0aGlzIHByb2R1Y3QsIGFuZCB0aGUgZGF0YSB3YXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBgSU5TVElUVVRJT05fTUFTS2A6IFRoZSB1c2VyIG1hbnVhbGx5IHByb3ZpZGVkIHRoZSBmdWxsIGFjY291bnQgbnVtYmVyLCB3aGljaCB3YXMgbWF0Y2hlZCB0byB0aGUgYWNjb3VudCBtYXNrIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gT25seSBhcHBsaWNhYmxlIHRvIHRoZSBgbnVtYmVyc2AgZGF0YSB0eXBlLiBgVVNFUmA6IFRoZSBpbnN0aXR1dGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgcHJvZHVjdCwgYW5kIHRoZSBkYXRhIHdhcyBtYW51YWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERhdGFTb3VyY2VzIHtcbiAgICBJbnN0aXR1dGlvbiA9ICdJTlNUSVRVVElPTicsXG4gICAgSW5zdGl0dXRpb25NYXNrID0gJ0lOU1RJVFVUSU9OX01BU0snLFxuICAgIFVzZXIgPSAnVVNFUidcbn1cblxuLyoqXG4gKiBBIGRhdGUgcmFuZ2Ugd2l0aCBhIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXRlUmFuZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBiZWdpbm5pbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGF0ZVJhbmdlXG4gICAgICovXG4gICAgZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8RGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlIGZvciBhbiBJdGVtLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSB0aGUgd2ViaG9vayByZWxhdGVzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIFRoZSB1c2VyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIChEZXByZWNhdGVkKSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnR9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdGFyZ2V0X3VzZXI6IERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgSXRlbSwgdHlwaWNhbGx5IHByb3ZpZGVkIGluIHRoZSBJbXBvcnQgSXRlbSByZXNwb25zZS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWQgQWNjb3VudCBJRCB0aGF0IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGJhbmsgYWNjb3VudC4gVGhpcyBhY2NvdW50IHdpbGwgYmVjb21lIHRoZSByZWNpcGllbnQgZm9yIGEgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbiBpdGVtcyB0byB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSB1c2VyIHRvIHRoZWlyIFBheXJvbGwgUHJvdmlkZXIuIFRoZXNlIHRva2VucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIHNhbWUgY2xpZW50IGlkIGFzIHRoZSBvbmUgY3JlYXRpbmcgdGhlIHN3aXRjaCwgYW5kIGhhdmUgYWNjZXNzIHRvIHRoZSB0cmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faXRlbV9hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFxcXCJERVBPU0lUX1NXSVRDSFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgXFxcIlNXSVRDSF9TVEFURV9VUERBVEVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogIFRoZSBzdGF0ZSwgb3Igc3RhdHVzLCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guICBgaW5pdGlhbGl6ZWRgOiBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgYHByb2Nlc3NpbmdgOiBUaGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgYmVlbiBzdWJtaXR0ZWQgYW5kIGlzIGJlaW5nIHByb2Nlc3NlZC4gIGBjb21wbGV0ZWRgOiBUaGUgdXNlclxcJ3MgZW1wbG95ZXIgaGFzIGZ1bGZpbGxlZCBhbmQgY29tcGxldGVkIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgYGVycm9yYDogVGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbRGVwb3NpdCBTd2l0Y2ggQVBJIHJlZmVyZW5jZV0oL2RvY3MvZGVwb3NpdC1zd2l0Y2gvcmVmZXJlbmNlI2RlcG9zaXRfc3dpdGNoZ2V0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgVGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgZm9yIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb24gYWNjb3VudCwgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyIGluIHRoZSBEZXBvc2l0IFN3aXRjaCBpbnRlcmZhY2UuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIG9ubGluZSBiYW5raW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncydcbn1cblxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgVGhlIGRlcG9zaXQgc3dpdGNoIHRhcmdldCB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBnaXZlbiBuYW1lIChmaXJzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmFtaWx5IG5hbWUgKGxhc3QgbmFtZSkgb2YgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGEgdmFyaWV0eSBvZiBwaG9uZSBudW1iZXIgZm9ybWF0cywgaW5jbHVkaW5nIEUuMTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHRheHBheWVyIElEIG9mIHRoZSB1c2VyLCBnZW5lcmFsbHkgdGhlaXIgU1NOLCBFSU4sIG9yIFRJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIHRheF9wYXllcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIERlcG9zaXQgc3dpdGNoIHRva2VuLCB1c2VkIHRvIGluaXRpYWxpemUgTGluayBmb3IgdGhlIERlcG9zaXQgU3dpdGNoIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXhwaXJhdGlvbiB0aW1lIG9mIHRoZSB0b2tlbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogT3JpZ2luYXRvciBhbmQgdGhlaXIgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIG91dHN0YW5kaW5nIHJlcXVpcmVtZW50cyBmb3Igc2NhbGVkIHBsYXRmb3JtIG9yaWdpbmF0b3JzLiBPbmx5IHBvcHVsYXRlZCB3aGVuIGB0cmFuc2Zlcl9kaWxpZ2VuY2Vfc3RhdHVzYCBpcyBgbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZGAuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD59XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX3JlcXVpcmVtZW50cz86IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD47XG59XG4vKipcbiAqIEEgcG9zc2libGUgYWNjb3VudCBkZXRlY3RlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRlY3RlZEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RlZEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBhY2NvdW50IHR5cGUgKGRlcG9zaXRvcnksIGNyZWRpdCwgbG9hbiwgaW52ZXN0bWVudCBldGMuKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbnMgdG8vZnJvbSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogRGV2aWNlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBsaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV2aWNlSWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VJZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV2aWNlSWRcbiAgICAgKi9cbiAgICB0eXBlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBkZXZpY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXZpY2VJZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBET0NVTUVOVF9UWVBFX1BBWVNUVUJgOiBBIHBheXN0dWIuICBgRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX0dJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYERPQ1VNRU5UX1RZUEVfTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jVHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEb2N1bWVudFR5cGVQYXlzdHViID0gJ0RPQ1VNRU5UX1RZUEVfUEFZU1RVQicsXG4gICAgRG9jdW1lbnRUeXBlQmFua1N0YXRlbWVudCA9ICdET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheFcyID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5RXJhcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlMZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlDbGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFUycsXG4gICAgRG9jdW1lbnRUeXBlR2lnID0gJ0RPQ1VNRU5UX1RZUEVfR0lHJyxcbiAgICBEb2N1bWVudFR5cGVOb25lID0gJ0RPQ1VNRU5UX1RZUEVfTk9ORScsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5TWlzYyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X01JU0MnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OUsgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9LJyxcbiAgICBEb2N1bWVudFR5cGVQbGFpZEdlbmVyYXRlZFBheXN0dWJQZGYgPSAnRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREYnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbmFseXNpc0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBmcmF1ZF9hbmFseXNpc19kZXRhaWxzPzogRnJhdWRBbmFseXNpc0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbWFnZVF1YWxpdHlEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudEFuYWx5c2lzXG4gICAgICovXG4gICAgaW1hZ2VfcXVhbGl0eV9kZXRhaWxzPzogSW1hZ2VRdWFsaXR5RGV0YWlscyB8IG51bGw7XG59XG4vKipcbiAqIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB3aGV0aGVyIHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UgbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBhbmQgc2VjdXJpdHkgY2hlY2tzIGZvciB0aGUgYXNzb2NpYXRlZCBqdXJpc2RpY3Rpb24uICBGb3IgZXhhbXBsZSwgbW9zdCBpZGVudGl0eSBkb2N1bWVudHMgaGF2ZSBmb3JtYXR0aW5nIHJ1bGVzIGxpa2UgdGhlIGZvbGxvd2luZzogICBUaGUgaW1hZ2Ugb2YgdGhlIHBlcnNvblxcJ3MgZmFjZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGNvbnRyYXN0IGluIG9yZGVyIHRvIGhpZ2hsaWdodCBza2luIHRvbmUgICBUaGUgc3ViamVjdCBpbiB0aGUgZG9jdW1lbnRcXCdzIGltYWdlIG11c3QgcmVtb3ZlIGV5ZSBnbGFzc2VzIGFuZCBwb3NlIGluIGEgY2VydGFpbiB3YXkgICBUaGUgaW5mb3JtYXRpb25hbCBmaWVsZHMgKG5hbWUsIGRhdGUgb2YgYmlydGgsIElEIG51bWJlciwgZXRjLikgbXVzdCBiZSBjb2xvcmVkIGFuZCBhbGlnbmVkIGFjY29yZGluZyB0byBzcGVjaWZpYyBydWxlcyAgIFNlY3VyaXR5IGZlYXR1cmVzIGxpa2Ugd2F0ZXJtYXJrcyBhbmQgYmFja2dyb3VuZCBwYXR0ZXJucyBtdXN0IGJlIHByZXNlbnQgIFNvIGEgYG1hdGNoYCBzdGF0dXMgZm9yIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBzZWVtcyB0byBjb25mb3JtIHRvIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgYW5kIHNlY3VyaXR5IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBkYXRlIG9mIGJpcnRoLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgZGF0ZSBvZiBiaXJ0aCB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY190eXBlPzogRG9jVHlwZTtcbn1cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgbmFtZSwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIG5hbWUgdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnROYW1lTWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBjZXJ0YWluIHJlYXNvbiBhcyB0byB3aHkgYSBkb2N1bWVudCBjb3VsZCBwb3RlbnRpYWxseSBiZSBmcmF1ZHVsZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHJpc2sgZm91bmQgaW4gdGhlIHJpc2sgc2lnbmFsIGNoZWNrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIHdoaWNoIHRoZSByaXNrIHNpZ25hbCB3YXMgY29tcHV0ZWQgZm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZmllbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHVzZWQgdG8gcXVpY2tseSBpZGVudGlmeSBpZiB0aGUgc2lnbmFsIGluZGljYXRlcyB0aGF0IHRoaXMgZmllbGQgaXMgYXV0aGVudGljIG9yIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaGFzX2ZyYXVkX3Jpc2s6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9tZXRhZGF0YTogRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBmaWVsZCwgYXMgc2VlbiBvbiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBleHBlY3RlZF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVyaXZlZCB2YWx1ZSBvYnRhaW5lZCBpbiB0aGUgcmlzayBzaWduYWwgY2FsY3VsYXRpb24gcHJvY2VzcyBmb3IgdGhpcyBmaWVsZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGFjdHVhbF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHByb3ZpZGluZyBtb3JlIGRldGFpbCBpbnRvIHRoZSBwYXJ0aWN1bGFyIHJpc2sgc2lnbmFsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgc2lnbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWxldmFudCBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlzayBzaWduYWwuIElmIHRoZSByaXNrIHNpZ25hbCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgcGFnZSwgdGhlIHZhbHVlIHdpbGwgYmUgMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBwYWdlX251bWJlcjogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGluc3RpdHV0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmVyaWZpY2F0aW9uIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBmb3IgYSBzZXQgb2YgaW5jb21lIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnQgbWV0YWRhdGEgYW5kIGFzc29jaWF0ZWQgcmlzayBzaWduYWxzIHBlciBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxTaW5nbGVEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgc2luZ2xlX2RvY3VtZW50X3Jpc2tfc2lnbmFsczogQXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByaXNrIHNpZ25hbHMgY29tcHV0ZWQgZnJvbSBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHMgYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50c1xcJyBtZXRhZGF0YVxuICAgICAqIEB0eXBlIHtBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBtdWx0aV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogQSBzdW1tYXJ5IGFjcm9zcyBhbGwgcmlzayBzaWduYWxzIGFzc29jaWF0ZWQgd2l0aCBhIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1N1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCwgaW5jbHVzaXZlLCB3aGVyZSBhIHNjb3JlIGNsb3NlciB0byAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSB0cnVzdHdvcnRoeSBhbmQgYSBzY29yZSBjbG9zZXIgdG8gMTAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSBmcmF1ZHVsZW50LiBZb3UgY2FuIGF1dG9tYXRpY2FsbHkgcmVqZWN0IGRvY3VtZW50cyB3aXRoIGEgaGlnaCByaXNrIHNjb3JlLCBhdXRvbWF0aWNhbGx5IGFjY2VwdCBkb2N1bWVudHMgd2l0aCBhIGxvdyByaXNrIHNjb3JlLCBhbmQgbWFudWFsbHkgcmV2aWV3IGRvY3VtZW50cyBpbiBiZXR3ZWVuLiBXZSBzdWdnZXN0IHN0YXJ0aW5nIHdpdGggYSB0aHJlc2hvbGQgb2YgODAgZm9yIGF1dG8tcmVqZWN0aW9uIGFuZCAyMCBmb3IgYXV0by1hY2NlcHRhbmNlLiBBcyB5b3UgZ2F0aGVyIG1vcmUgZGF0YSBwb2ludHMgb24gdHlwaWNhbCByaXNrIHNjb3JlcyBmb3IgeW91ciB1c2UgY2FzZSwgeW91IGNhbiB0dW5lIHRoZXNlIHBhcmFtZXRlcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHVuZGVyZ29pbmcgbWFudWFsIHJldmlldy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19zY29yZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgZG9jdW1lbnQgc3VibWlzc2lvbi4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnXG59XG5cbi8qKlxuICogRGF0YSwgaW1hZ2VzLCBhbmFseXNpcywgYW5kIHJlc3VsdHMgZnJvbSB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkb2N1bWVudHMgc3VibWl0dGVkIHRvIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbiwgd2hlcmUgZWFjaCBzdWJtaXNzaW9uIHdpbGwgY29udGFpbiBib3RoIGEgZnJvbnQgYW5kIGJhY2sgaW1hZ2UsIG9yIGp1c3QgYSBmcm9udCBpbWFnZSwgZGVwZW5kaW5nIG9uIHRoZSBkb2N1bWVudCB0eXBlLiAgTm90ZTogUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGxldCBhIHVzZXIgc3VibWl0IGEgbmV3IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgdXAgdG8gdGhyZWUgdGltZXMgaWYgd2UgZGV0ZWN0IHRoYXQgYSBwcmV2aW91cyBhdHRlbXB0IG1pZ2h0IGhhdmUgZmFpbGVkIGR1ZSB0byB1c2VyIGVycm9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgYXJlIGJsdXJyeSBvciBvYnNjdXJlZCBieSBnbGFyZSwgdGhlIHVzZXIgd2lsbCBiZSBhc2tlZCB0byBjYXB0dXJlIHRoZWlyIGRvY3VtZW50cyBhZ2FpbiwgcmVzdWx0aW5nIGluIGF0IGxlYXN0IHR3byBzZXBhcmF0ZSBlbnRyaWVzIHdpdGhpbiBgZG9jdW1lbnRzYC4gSWYgdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaXMgYGZhaWxlZGAsIHRoZSB1c2VyIGhhcyBleGhhdXN0ZWQgdGhlaXIgcmV0cnkgYXR0ZW1wdHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRvY3VtZW50czogQXJyYXk8RG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudD47XG59XG4vKipcbiAqIEltYWdlcywgZXh0cmFjdGVkIGRhdGEsIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3MgaWRlbnRpdHkgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogRG9jdW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IGRvY3VtZW50IHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50SW1hZ2VzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgaW1hZ2VzOiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBhbmFseXNpczogRG9jdW1lbnRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8RWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgQmFzaWNBbGxvd2FuY2VIb3VzaW5nID0gJ0JBU0lDIEFMTE9XQU5DRSBIT1VTSU5HJyxcbiAgICBCYXNpY0FsbG93YW5jZVN1YnNpc3RlbmNlID0gJ0JBU0lDIEFMTE9XQU5DRSBTVUJTSVNURU5DRScsXG4gICAgT3RoZXIgPSAnT1RIRVInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbWFpbCBhZGRyZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGVtYWlsIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBlbWFpbCBhY2NvdW50IGFzIGRlc2NyaWJlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgdHlwZTogRW1haWxUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBFbWFpbFR5cGVFbnVtIHtcbiAgICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxuICAgIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGVtYWlsIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgZW1haWwgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIGVtYWlsLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoLCA5OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2ggKG1hdGNoaW5nIHRoZSBzYW1lIGVtYWlsIHdpdGggZGlmZmVyZW50IFxcJytcXCcgZXh0ZW5zaW9ucyksIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBlbWFpbCBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgc2luZ2xlYCBvciBgbWFycmllZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ/OiBUYXhwYXllcklEO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBBZGRyZXNzRGF0YU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBmcm9tIDAgdG8gMSBpbmRpY2F0aW5nIFBsYWlkXFwncyBsZXZlbCBvZiBjb25maWRlbmNlIGluIHRoZSBwYWlyaW5nIGJldHdlZW4gdGhlIGVtcGxveWVyIGFuZCB0aGUgaW5zdGl0dXRpb24gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgY29uZmlkZW5jZV9zY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBuYW1lIHRvIGJlIHNlYXJjaGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgcHJvZHVjdHMgdGhlIHJldHVybmVkIGVtcGxveWVycyBzaG91bGQgc3VwcG9ydC4gQ3VycmVudGx5LCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGBcXFwiZGVwb3NpdF9zd2l0Y2hcXFwiYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3llcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyczogQXJyYXk8RW1wbG95ZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBlbXBsb3ltZW50IGRldGFpbHMgZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYW5udWFsX3NhbGFyeT86IFBheTtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9uIHdoaWNoIHRoZSBlbXBsb3llZSB3YXMgaGlyZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGhpcmVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRTb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWxcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzPzogRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgb2YgZW1wbG95bWVudCwgaWYgYXBwbGljYWJsZS4gUHJvdmlkZWQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYXRmb3JtSWRzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGxhdGZvcm1faWRzPzogUGxhdGZvcm1JZHM7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIHN1bW1hcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRzOiBBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgRW1wbG95bWVudFN0YXR1c0FjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19BQ1RJVkUnLFxuICAgIEVtcGxveW1lbnRTdGF0dXNJbmFjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19JTkFDVElWRScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVuaGFuY2VtZW50IGZpZWxkcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxDb3VudGVycGFydHk+O1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYWNjb3VudCBob2xkZXI6ICBgT1VURkxPV2AgLSBJbmNsdWRlcyBvdXRnb2luZyB0cmFuc2ZlcnMsIHB1cmNoYXNlcywgYW5kIGZlZXMuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgcG9zaXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLikgIGBJTkZMT1dgIC0gSW5jbHVkZXMgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzLCBhbmQgaW5jb21lLiAoVHlwaWNhbGx5IHJlcHJlc2VudGVkIGFzIGEgcG9zaXRpdmUgdmFsdWUgb24gY2hlY2tpbmcgYWNjb3VudHMgYW5kIGRlYml0IGNhcmRzIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNyZWRpdCBjYXJkcy4pXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbiB7XG4gICAgSW5mbG93ID0gJ0lORkxPVycsXG4gICAgT3V0ZmxvdyA9ICdPVVRGTE9XJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVucmljaG1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnJpY2htZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVucmljaG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllczogQXJyYXk8Q291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBsZWdhY3kgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxlZ2FjeV9jYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGxlZ2FjeSBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgZm9yIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHRvIG9idGFpbiB0aGUgYmVzdCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENoYW5uZWx9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5IGluIEUuIDE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICByZWN1cnJlbmNlPzogUmVjdXJyZW5jZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eURvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogRW50aXR5RG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlrYCAtIFJ1c3NpYW4gYmFuayBjb2RlICBgYnVzaW5lc3NfbnVtYmVyYCAtIEEgbnVtYmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgYnVzaW5lc3Mgd2l0aGluIGEgY2F0ZWdvcnkgb2YgYnVzaW5lc3NlcyAgYGltb2AgLSBOdW1iZXIgYXNzaWduZWQgdG8gdGhlIGVudGl0eSBieSB0aGUgSW50ZXJuYXRpb25hbCBNYXJpdGltZSBPcmdhbml6YXRpb24gIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHN3aWZ0YCAtIE51bWJlciBpZGVudGlmeWluZyBhIGJhbmsgYW5kIGJyYW5jaC4gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlEb2N1bWVudFR5cGUge1xuICAgIEJpayA9ICdiaWsnLFxuICAgIEJ1c2luZXNzTnVtYmVyID0gJ2J1c2luZXNzX251bWJlcicsXG4gICAgSW1vID0gJ2ltbycsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFN3aWZ0ID0gJ3N3aWZ0JyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnXG59XG5cbi8qKlxuICogQW5hbHlzaXMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aHkgYSBzY3JlZW5pbmcgaGl0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIGVudGl0eSBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVycz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgdXJscz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIGVudGl0eSBzY3JlZW5pbmcgaGl0cyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhleSBoYXZlIGJlZW4gcmV2aWV3ZWQuIElmIGNoYW5nZXMgYXJlIGRldGVjdGVkIGR1ZSB0byB1cGRhdGVzIHRvIHRoZSBlbnRpdHkgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zX3ZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICB1cmxzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnRzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eURvY3VtZW50O1xufVxuLyoqXG4gKiBFbWFpbCBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHMge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJscyB7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW50aXR5X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGVudGl0aWVzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX1NPRWA6IFN0YXRlIE93bmVkIEVudGVycHJpc2UgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVU19DQVBgOiBVUyBPRkFDIENvcnJlc3BvbmRlbnQgQWNjb3VudCBvciBQYXlhYmxlLVRocm91Z2ggQWNjb3VudCBTYW5jdGlvbnMgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19NQlNgOiBVUyBOb24tU0ROIE1lbnUtQmFzZWQgU2FuY3Rpb25zICBgVVNfU0ROYDogVVMgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmF0aW9uYWxzIExpc3QgIGBVU19TU0lgOiBVUyBPRkFDIFNlY3RvcmFsIFNhbmN0aW9ucyBJZGVudGlmaWNhdGlvbnMgIGBVU19DTUNgOiBVUyBPRkFDIE5vbi1TRE4gQ2hpbmVzZSBNaWxpdGFyeS1JbmR1c3RyaWFsIENvbXBsZXggTGlzdCAgYFVTX1VWTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgVW52ZXJpZmllZCBMaXN0ICBgVUtfSE1DYDogVUsgSE0gVHJlYXN1cnkgQ29uc29saWRhdGVkIExpc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eVdhdGNobGlzdENvZGUge1xuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJelNvZSA9ICdJWl9TT0UnLFxuICAgIEl6VW5jID0gJ0laX1VOQycsXG4gICAgSXpXYmsgPSAnSVpfV0JLJyxcbiAgICBVc0NhcCA9ICdVU19DQVAnLFxuICAgIFVzRnNlID0gJ1VTX0ZTRScsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1NkbiA9ICdVU19TRE4nLFxuICAgIFVzU3NpID0gJ1VTX1NTSScsXG4gICAgVXNDbWMgPSAnVVNfQ01DJyxcbiAgICBVc1V2bCA9ICdVU19VVkwnLFxuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgVWtIbWMgPSAnVUtfSE1DJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogRW50aXR5V2F0Y2hsaXN0Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXZlcnNhbCBpZGVudGlmaWVyIGZvciBhIHdhdGNobGlzdCBpbmRpdmlkdWFsIHRoYXQgaXMgc3RhYmxlIGFjcm9zcyBzZWFyY2hlcyBhbmQgdXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBwbGFpZF91aWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc291cmNlIHNhbmN0aW9uIG9yIHdhdGNobGlzdC4gV2hlbiBvbmUgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHNvdXJjZV91aWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0RGF0YTtcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgdXNlZCBmb3Igc2VhcmNoaW5nIGFnYWluc3Qgd2F0Y2hsaXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24gYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2Ygd2hldGhlciB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudCB3YXMgZXhwaXJlZCB3aGVuIHRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZC4gIE5vdGU6IEluIHRoZSBjYXNlIHdoZXJlIGFuIGV4cGlyYXRpb24gZGF0ZSBpcyBub3QgcHJlc2VudCBvbiB0aGUgZG9jdW1lbnQgb3IgZmFpbGVkIHRvIGJlIGV4dHJhY3RlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEV4cGlyYXRpb25EYXRlIHtcbiAgICBOb3RFeHBpcmVkID0gJ25vdF9leHBpcmVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFBsYWlkIGFuZCBGRFgtZGVmaW5lZCByZWNpcGllbnQgbWV0YWRhdGEgZmllbGRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBuYW1lIGRpc3BsYXllZCBieSB0aGUgRGF0YSBQcm92aWRlciBkdXJpbmcgdGhlIGNvbnNlbnQgZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X2xlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggdGhlIHJlY2lwaWVudCBnYWluZWQgcHJvZHVjdGlvbiBhY2Nlc3MgdG8gUGxhaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgam9pbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIERhdGEgUGFydG5lciBjb25zdW1lcnMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSByZWNpcGllbnQgZm9yIHRoZSBzcGVjaWZpYyBEYXRhIFBhcnRuZXJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCB0aGUgcmVjaXBpZW50IGdhaW5lZCBwcm9kdWN0aW9uIGFjY2VzcyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFBbGxPZlxuICAgICAqL1xuICAgIGpvaW5lZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBEYXRhIFBhcnRuZXIgY29uc3VtZXJzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgcmVjaXBpZW50IGZvciB0aGUgc3BlY2lmaWMgRGF0YSBQYXJ0bmVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9ucy4gUGxlYXNlIHVzZSBgcGF5ZXJfZGV0YWlsc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGV4dGVybmFsIHBheW1lbnQgcmVmdW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGJhY3M6IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbD86IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFR5cGVzIG9mIGRvY3VtZW50IGZvcm1hdHMuIChTdWdnZXN0ZWQgdmFsdWVzKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYQ29udGVudFR5cGVzIHtcbiAgICBBcHBsaWNhdGlvblBkZiA9ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgIEltYWdlR2lmID0gJ2ltYWdlL2dpZicsXG4gICAgSW1hZ2VKcGVnID0gJ2ltYWdlL2pwZWcnLFxuICAgIEltYWdlVGlmZiA9ICdpbWFnZS90aWZmJyxcbiAgICBJbWFnZVBuZyA9ICdpbWFnZS9wbmcnLFxuICAgIEFwcGxpY2F0aW9uSnNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJ1xufVxuXG4vKipcbiAqIEZpbmFuY2lhbCBJbnN0aXR1dGlvbiBwcm92aWRlci1zcGVjaWZpYyBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYRmlBdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBhdHRyaWJ1dGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhdHRyaWJ1dGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG4vKipcbiAqIFJFU1QgYXBwbGljYXRpb24gY29uc3RyYWludCAoSHlwZXJtZWRpYSBBcyBUaGUgRW5naW5lIE9mIEFwcGxpY2F0aW9uIFN0YXRlKVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhIYXRlb2FzTGlua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rIHtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gaW52b2tlIHRoZSBhY3Rpb24gb24gdGhlIHJlc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICBocmVmOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rQWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGFjdGlvbj86IEZEWEhhdGVvYXNMaW5rQWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFJlbGF0aW9uIG9mIHRoaXMgbGluayB0byBpdHMgY29udGFpbmluZyBlbnRpdHksIGFzIGRlZmluZWQgYnkgYW5kIHdpdGggbWFueSBleGFtcGxlIHJlbGF0aW9uIHZhbHVlcyBhdCBbSUVURiBSRkM1OTg4XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzU5ODgpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICByZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29udGVudC10eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICogQHR5cGUge0FycmF5PEZEWENvbnRlbnRUeXBlcz59XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgdHlwZXM/OiBBcnJheTxGRFhDb250ZW50VHlwZXM+O1xufVxuLyoqXG4gKiBIVFRQIE1ldGhvZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhIYXRlb2FzTGlua0FjdGlvbiB7XG4gICAgR2V0ID0gJ0dFVCcsXG4gICAgUG9zdCA9ICdQT1NUJyxcbiAgICBQYXRjaCA9ICdQQVRDSCcsXG4gICAgRGVsZXRlID0gJ0RFTEVURScsXG4gICAgUHV0ID0gJ1BVVCdcbn1cblxuLyoqXG4gKiBJbml0aWF0b3IgRmkgQXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlPzogRkRYUGFydHlUeXBlO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgYmFzZSBmaWVsZHMgb2YgYSBub3RpZmljYXRpb24uIENsaWVudHMgd2lsbCByZWFkIHRoZSBgdHlwZWAgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBub3RpZmljYXRpb24gcGF5bG9hZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIElkIG9mIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEZEWE5vdGlmaWNhdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogSVNPIDg2MDEgZGF0ZS10aW1lIGluIGZvcm1hdCBcXCdZWVlZLU1NLUREVGhoOm1tOnNzLm5ubltafFsrfC1daGg6bW1dXFwnIGFjY29yZGluZyB0byBbSUVURiBSRkMzMzM5XShodHRwczovL3htbDJyZmMudG9vbHMuaWV0Zi5vcmcvcHVibGljL3JmYy9odG1sL3JmYzMzMzkuaHRtbCNhbmNob3IxNClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZW50T246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBGRFhOb3RpZmljYXRpb25DYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uU2V2ZXJpdHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHNldmVyaXR5PzogRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblByaW9yaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmlvcml0eT86IEZEWE5vdGlmaWNhdGlvblByaW9yaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHVibGlzaGVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdWJzY3JpYmVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblBheWxvYWR9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvblBheWxvYWQ6IEZEWE5vdGlmaWNhdGlvblBheWxvYWQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBGRFhIYXRlb2FzTGluaztcbn1cbi8qKlxuICogQ2F0ZWdvcnkgb2YgTm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25DYXRlZ29yeSB7XG4gICAgU2VjdXJpdHkgPSAnU0VDVVJJVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBGcmF1ZCA9ICdGUkFVRCcsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJyxcbiAgICBOZXdEYXRhID0gJ05FV19EQVRBJ1xufVxuXG4vKipcbiAqIEN1c3RvbSBrZXktdmFsdWUgcGFpcnMgcGF5bG9hZCBmb3IgYSBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIElEIGZvciB0aGUgb3JpZ2luYXRpb24gZW50aXR5IHJlbGF0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkVHlwZT86IEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEZEWEZpQXR0cmlidXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGN1c3RvbUZpZWxkcz86IEFycmF5PEZEWEZpQXR0cmlidXRlPjtcbn1cbi8qKlxuICogVHlwZSBvZiBlbnRpdHkgY2F1c2luZyBvcmlnaW5hdGlvbiBvZiBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZSB7XG4gICAgQWNjb3VudCA9ICdBQ0NPVU5UJyxcbiAgICBDdXN0b21lciA9ICdDVVNUT01FUicsXG4gICAgUGFydHkgPSAnUEFSVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogUHJpb3JpdHkgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25Qcmlvcml0eSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBNZWRpdW0gPSAnTUVESVVNJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFNldmVyaXR5IGxldmVsIG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHkge1xuICAgIEVtZXJnZW5jeSA9ICdFTUVSR0VOQ1knLFxuICAgIEFsZXJ0ID0gJ0FMRVJUJyxcbiAgICBXYXJuaW5nID0gJ1dBUk5JTkcnLFxuICAgIE5vdGljZSA9ICdOT1RJQ0UnLFxuICAgIEluZm8gPSAnSU5GTydcbn1cblxuLyoqXG4gKiBUeXBlIG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uVHlwZSB7XG4gICAgQ29uc2VudFJldm9rZWQgPSAnQ09OU0VOVF9SRVZPS0VEJyxcbiAgICBDb25zZW50VXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnLFxuICAgIEN1c3RvbSA9ICdDVVNUT00nLFxuICAgIFNlcnZpY2UgPSAnU0VSVklDRScsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBQbGFubmVkT3V0YWdlID0gJ1BMQU5ORURfT1VUQUdFJ1xufVxuXG4vKipcbiAqIEZEWCBQYXJ0aWNpcGFudCAtIGFuIGVudGl0eSBvciBwZXJzb24gdGhhdCBpcyBhIHBhcnQgb2YgYSBGRFggQVBJIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWFBhcnR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYUGFydHkge1xuICAgIC8qKlxuICAgICAqIEh1bWFuIHJlY29nbml6YWJsZSBjb21tb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgdHlwZTogRkRYUGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgcGFydHksIHdoZXJlIGFuIGVuZCB1c2VyIGNvdWxkIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGNvbXBhbnkgb3IgYXBwbGljYXRpb24gaW52b2x2ZWQgaW4gdGhlIGRhdGEgc2hhcmluZyBjaGFpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgaG9tZVVyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkkgZm9yIGEgbG9nbyBhc3NldCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBsb2dvVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVJlZ2lzdHJ5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdHJ5PzogRkRYUGFydHlSZWdpc3RyeTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcmVkIG5hbWUgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlOYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgaWQgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlJZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgdGhlIHBhcnR54oCZcyByZWdpc3RyYXRpb24gd2l0aCBuYW1lIGFuZCBpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYUGFydHlSZWdpc3RyeSB7XG4gICAgRmR4ID0gJ0ZEWCcsXG4gICAgR2xlaWYgPSAnR0xFSUYnLFxuICAgIEljYW5uID0gJ0lDQU5OJyxcbiAgICBQcml2YXRlID0gJ1BSSVZBVEUnXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBhIHBhcnR5XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVR5cGUge1xuICAgIERhdGFBY2Nlc3NQbGF0Zm9ybSA9ICdEQVRBX0FDQ0VTU19QTEFURk9STScsXG4gICAgRGF0YVByb3ZpZGVyID0gJ0RBVEFfUFJPVklERVInLFxuICAgIERhdGFSZWNpcGllbnQgPSAnREFUQV9SRUNJUElFTlQnLFxuICAgIEluZGl2aWR1YWwgPSAnSU5ESVZJRFVBTCcsXG4gICAgTWVyY2hhbnQgPSAnTUVSQ0hBTlQnLFxuICAgIFZlbmRvciA9ICdWRU5ET1InXG59XG5cbi8qKlxuICogUmVjaXBpZW50IG1ldGFkYXRhIGZpZWxkcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IEZEWFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgbmFtZSBkaXNwbGF5ZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgZHVyaW5nIHRoZSBjb25zZW50IGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBSZWNpcGllbnQgTG9nbyBVUkwgbG9jYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9sZWdhbF9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBpcyBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkIHVzaW5nIG1pY3JvLWRlcG9zaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWljcm8tZGVwb3NpdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBoYXMgYW4gZXhwaXJlZCB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBzdXJyb3VuZGluZyBleHRlcm5hbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlZCBhY2NvdW50cywgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIG5hdHVyZSBvZiB0cmFuc2ZlcnMgdG8vZnJvbSB0aGlzIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxEZXRlY3RlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZGV0ZWN0ZWRfYWNjb3VudHM6IEFycmF5PERldGVjdGVkQWNjb3VudD47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRml4ZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXhlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lpZWxkUmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICB5aWVsZF9yYXRlOiBZaWVsZFJhdGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXR1cml0eSBkYXRlIGZvciB0aGlzIGZpeGVkIGluY29tZSBzZWN1cml0eSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpeGVkSW5jb21lXG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaXNzdWUgZGF0ZSBmb3IgdGhpcyBmaXhlZCBpbmNvbWUgc2VjdXJpdHksIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaXhlZEluY29tZVxuICAgICAqL1xuICAgIGlzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZhY2UgdmFsdWUgdGhhdCBpcyBwYWlkIHVwb24gbWF0dXJpdHkgb2YgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eSwgcGVyIHVuaXQgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICBmYWNlX3ZhbHVlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50LiBUaGlzIGFtb3VudCByZWZsZWN0cyB0aGUgZnVuZHMgZGVwb3NpdGVkIGludG8gdGhlIGFjY291bnQgYW5kIG1heSBub3QgaW5jbHVkZSBhbnkgd2l0aGhlbGQgaW5jb21lIHN1Y2ggYXMgdGF4ZXMgb3Igb3RoZXIgcGF5cm9sbCBkZWR1Y3Rpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWNhc3RlZE1vbnRobHlJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JlY2FzdGVkIG1vbnRobHkgaW5jb21lIGF0IHRoZSB0aW1lIG9mIHN1YnNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZm9yZWNhc3RlZCBtb250aGx5IGluY29tZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogRm9ybSAxMDk5IFR5cGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZvcm0xMDk5VHlwZSB7XG4gICAgVW5rbm93biA9ICdGT1JNXzEwOTlfVFlQRV9VTktOT1dOJyxcbiAgICBNaXNjID0gJ0ZPUk1fMTA5OV9UWVBFX01JU0MnLFxuICAgIEsgPSAnRk9STV8xMDk5X1RZUEVfSydcbn1cblxuLyoqXG4gKiBBbiBhcmJpdHJhcnkgSlNPTiBwYXlsb2FkIHNlbnQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgUGxhaWQgc2VydmVyLiBJbnRlcm5hbCB1c2Ugb25seS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiB0aGUgZnJhdWQgb3IgYXR0ZW1wdGVkIGZyYXVkLiBgZnJhdWRfYW1vdW50YCBzaG91bGQgYmUgb21pdHRlZCB0byBpbmRpY2F0ZSBhbiB1bmtub3duIGZyYXVkIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogSVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIDAgdG8gaW5kaWNhdGUgbm8gbW9uZXkgd2FzIGxvc3QuIE11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIChlLmcuLCBgMS4yM2ApLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZnJhdWQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFuYWx5c2lzRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIHR5cGVfc3VwcG9ydGVkOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgcG9ydHJhaXRfcHJlc2VuY2VfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBwb3J0cmFpdF9kZXRhaWxzX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaW1hZ2VfY29tcG9zaXRpb25fY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBpbnRlZ3JpdHlfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBkZXRhaWxfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaXNzdWVfZGF0ZV9jaGVjazogRnJhdWRDaGVja091dGNvbWVXaXRoTm9EYXRhO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgZnJhdWQgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHRoZSBmcmF1ZCBjaGVjaywgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGEge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQW5hbHl6ZWQgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9ucztcbn1cbi8qKlxuICogR2V0UmVjaXBpZW50UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnQve3JlY2lwaWVudElkfWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IG5hbWUgZGlzcGxheWVkIGJ5IHRoZSBEYXRhIFByb3ZpZGVyIGR1cmluZyB0aGUgY29uc2VudCBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsb2dvX3VyaT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEdldFJlY2lwaWVudFJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfbGVnYWxfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBHZXRSZWNpcGllbnRzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8RXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YT47XG59XG4vKipcbiAqIEEgc3RhdHVzIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBoaXN0b3JpY2FsIGFubnVhbCBpbmNvbWUgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbEFubnVhbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGhpc3RvcmljYWwgYW5udWFsIGluY29tZSBhdCB0aGUgdGltZSBvZiBzdWJzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgaGlzdG9yaWNhbCBhbm51YWwgaW5jb21lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEFubnVhbEluY29tZVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdmVzdGVkIGhvbGRpbmdzIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdmVzdGVkX3ZhbHVlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgb3IgdXBkYXRlZCBob2xkaW5ncyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LiBUaGUgd2ViaG9vayB0eXBpY2FsbHkgZmlyZXMgaW4gcmVzcG9uc2UgdG8gYW55IG5ld2x5IGFkZGVkIGhvbGRpbmdzIG9yIHByaWNlIGNoYW5nZXMgdG8gZXhpc3RpbmcgaG9sZGluZ3MsIG1vc3QgY29tbW9ubHkgYWZ0ZXIgbWFya2V0IGNsb3NlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEhPTERJTkdTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdXBkYXRlZCBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVwZGF0ZWRfaG9sZGluZ3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgaG9sZGluZ3Mgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZyAoZS5nLiwgdGhlIHRvdGFsIGFtb3VudCBzcGVudCB0byBhY3F1aXJlIGFsbCBhc3NldHMgY3VycmVudGx5IGluIHRoZSBob2xkaW5nKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY29zdF9iYXNpcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk6IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEhvdyBQbGFpZCBzaG91bGQgZGVsaXZlciB0aGUgUGxhaWQgTGluayBzZXNzaW9uIHRvIHRoZSBjdXN0b21lci4gT25seSBhdmFpbGFibGUgdG8gY3VzdG9tZXJzIGVuYWJsZWQgZm9yIExpbmsgRGVsaXZlcnkgKGJldGEpLiBUbyByZXF1ZXN0IExpbmsgRGVsaXZlcnkgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBcXCdzbXNcXCcgd2lsbCBkZWxpdmVyIHZpYSBTTVMuIE11c3QgcGFzcyBgdXNlci5waG9uZV9udW1iZXJgLiBcXCdlbWFpbFxcJyB3aWxsIGRlbGl2ZXIgdmlhIGVtYWlsLiBNdXN0IHBhc3MgYHVzZXIuZW1haWxfYWRkcmVzc2AuIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgaWdub3JlZDsgdXNlIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IHRvIHRlc3QgTGluayBEZWxpdmVyeSBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ3NtcycsXG4gICAgRW1haWwgPSAnZW1haWwnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgU01TIHNhbWUtZGF5IG1pY3JvZGVwb3NpdHMgdmVyaWZpY2F0aW9uIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFsIHN0YXR1cyBvZiB0aGUgc2FtZS1kYXkgbWljcm9kZXBvc2l0cyB2ZXJpZmljYXRpb24uIFdpbGwgYWx3YXlzIGJlIGBNQU5VQUxMWV9WRVJJRklFRGAgb3IgYFZFUklGSUNBVElPTl9GQUlMRURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIGdsb2JhbGx5IHVuaXF1ZSBhbmQgaHVtYW4gcmVhZGFibGUgSUQgdHlwZSwgc3BlY2lmaWMgdG8gdGhlIGNvdW50cnkgYW5kIGRvY3VtZW50IGNhdGVnb3J5LiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSHlicmlkIElucHV0IFZhbGlkYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElETnVtYmVyVHlwZSB7XG4gICAgQXJEbmkgPSAnYXJfZG5pJyxcbiAgICBBdURyaXZlcnNMaWNlbnNlID0gJ2F1X2RyaXZlcnNfbGljZW5zZScsXG4gICAgQXVQYXNzcG9ydCA9ICdhdV9wYXNzcG9ydCcsXG4gICAgQnJDcGYgPSAnYnJfY3BmJyxcbiAgICBDYVNpbiA9ICdjYV9zaW4nLFxuICAgIENsUnVuID0gJ2NsX3J1bicsXG4gICAgQ25SZXNpZGVudENhcmQgPSAnY25fcmVzaWRlbnRfY2FyZCcsXG4gICAgQ29OaXQgPSAnY29fbml0JyxcbiAgICBEa0NwciA9ICdka19jcHInLFxuICAgIEVnTmF0aW9uYWxJZCA9ICdlZ19uYXRpb25hbF9pZCcsXG4gICAgRXNEbmkgPSAnZXNfZG5pJyxcbiAgICBFc05pZSA9ICdlc19uaWUnLFxuICAgIEhrSGtpZCA9ICdoa19oa2lkJyxcbiAgICBJblBhbiA9ICdpbl9wYW4nLFxuICAgIEl0Q2YgPSAnaXRfY2YnLFxuICAgIEpvQ2l2aWxJZCA9ICdqb19jaXZpbF9pZCcsXG4gICAgSnBNeU51bWJlciA9ICdqcF9teV9udW1iZXInLFxuICAgIEtlSHVkdW1hTmFtYmEgPSAna2VfaHVkdW1hX25hbWJhJyxcbiAgICBLd0NpdmlsSWQgPSAna3dfY2l2aWxfaWQnLFxuICAgIE14Q3VycCA9ICdteF9jdXJwJyxcbiAgICBNeFJmYyA9ICdteF9yZmMnLFxuICAgIE15TnJpYyA9ICdteV9ucmljJyxcbiAgICBOZ05pbiA9ICduZ19uaW4nLFxuICAgIE56RHJpdmVyc0xpY2Vuc2UgPSAnbnpfZHJpdmVyc19saWNlbnNlJyxcbiAgICBPbUNpdmlsSWQgPSAnb21fY2l2aWxfaWQnLFxuICAgIFBoUHNuID0gJ3BoX3BzbicsXG4gICAgUGxQZXNlbCA9ICdwbF9wZXNlbCcsXG4gICAgUm9DbnAgPSAncm9fY25wJyxcbiAgICBTYU5hdGlvbmFsSWQgPSAnc2FfbmF0aW9uYWxfaWQnLFxuICAgIFNlUGluID0gJ3NlX3BpbicsXG4gICAgU2dOcmljID0gJ3NnX25yaWMnLFxuICAgIFRyVGNLaW1saWsgPSAndHJfdGNfa2ltbGlrJyxcbiAgICBVc1NzbiA9ICd1c19zc24nLFxuICAgIFVzU3NuTGFzdDQgPSAndXNfc3NuX2xhc3RfNCcsXG4gICAgWmFTbWFydElkID0gJ3phX3NtYXJ0X2lkJ1xufVxuXG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJU09DdXJyZW5jeUNvZGUge1xuICAgIFVzZCA9ICdVU0QnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGNoYW5nZSB0byBpZGVudGl0eSBkYXRhIGhhcyBiZWVuIGRldGVjdGVkIG9uIGFuIEl0ZW0uIEl0ZW1zIGFyZSBjaGVja2VkIGZvciBpZGVudGl0eSB1cGRhdGVzIGV2ZXJ5IDMwLTkwIGRheXMuIFdlIHJlY29tbWVuZCB0aGF0IHVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vayB5b3UgbWFrZSBhbm90aGVyIGNhbGwgdG8gYC9pZGVudGl0eS9nZXRgIHRvIGZldGNoIHRoZSB1c2VyXFwncyBsYXRlc3QgaWRlbnRpdHkgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgaWRlbnRpdHkgYXR0cmlidXRlcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwiUEhPTkVTXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8SWRlbnRpdHlVcGRhdGVUeXBlcz47IH19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfaWRlbnRpdHk6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8SWRlbnRpdHlVcGRhdGVUeXBlcz47IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHVwbG9hZGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudCBvYmplY3Qgd2l0aCBtZXRhZGF0YSBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWQge1xuICAgIC8qKlxuICAgICAqIEEgVVVJRCBpZGVudGlmeWluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHJpc2tfaW5zaWdodHM/OiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3VibWl0dGVkIGRvY3VtZW50IHR5cGUuIEN1cnJlbnRseSwgdGhpcyB3aWxsIGFsd2F5cyBiZSBgQkFOS19TVEFURU1FTlRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1cGxvYWRlZCBkb2N1bWVudFxcJ3MgYWNjb3VudCBudW1iZXIgbWF0Y2hlcyB0aGUgYWNjb3VudCBudW1iZXIgd2UgaGF2ZSBvbiBmaWxlLiBJZiBgZmFsc2VgLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXB0IHRoZSB1cGxvYWRlZCBpZGVudGl0eSBkYXRhIGFzIGFjY3VyYXRlIHdpdGhvdXQgZnVydGhlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGlzX2FjY291bnRfbnVtYmVyX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBkb2N1bWVudCB3YXMgbGFzdCB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBvcmlnaW5hbGx5IHVwbG9hZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIHVwbG9hZGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50aW5nIGZyYXVkIHJpc2sgZGF0YSBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQuIE9ubHkgcHJvdmlkZWQgd2hlbiB1c2luZyBJZGVudGl0eSBEb2N1bWVudCBVcGxvYWQgd2l0aCBGcmF1ZCBSaXNrIGVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gICAgICovXG4gICAgcmlza19zdW1tYXJ5PzogSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHJpc2sgc2lnbmFscy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gICAgICovXG4gICAgcmlza19zaWduYWxzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBSaXNrIHNpZ25hbHMgdGllZCB0byB0aGUgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmlzayBmb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGZyYXVkIHJpc2sgd2FzIGRldGVjdGVkIG9uIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBoYXNfZnJhdWRfcmlzaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gcHJvdmlkaW5nIG1vcmUgZGV0YWlsIGFib3V0IHRoZSBzcGVjaWZpYyByaXNrIHNpZ25hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaXNrIHNpZ25hbC4gSWYgdGhlIHJpc2sgc2lnbmFsIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwYWdlLCB0aGUgdmFsdWUgd2lsbCBiZSAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBSaXNrIHN1bW1hcnkgb2YgYW4gdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1N1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2hcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgbWF0Y2ggaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUsIHBob25lIG51bWJlciwgZW1haWwgYWRkcmVzcyBhbmQgYWRkcmVzcyB1c2VkIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2guIElmIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIGlzIGVuYWJsZWQgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LCBsZWF2ZSB0aGlzIGZpZWxkIGVtcHR5IHRvIGF1dG9tYXRpY2FsbHkgbWF0Y2ggYWdhaW5zdCBQSUkgY29sbGVjdGVkIGZyb20gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBjaGVja3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTU3NDUyMTMwXFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuIFBob25lIG51bWJlciBpbnB1dCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMgfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGlkZW50aXR5IGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlVcGRhdGVUeXBlcyB7XG4gICAgUGhvbmVzID0gJ1BIT05FUycsXG4gICAgQWRkcmVzc2VzID0gJ0FERFJFU1NFUycsXG4gICAgRW1haWxzID0gJ0VNQUlMUycsXG4gICAgTmFtZXMgPSAnTkFNRVMnXG59XG5cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gYXV0b2ZpbGxlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BPQm94U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBcXCcvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZVxcJ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3NoYXJlYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZsYWcgc3BlY2lmeWluZyBob3cgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gaGFuZGxlIGF0dGVtcHRzIHRvIGNyZWF0ZSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gd2hlbiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBpZGVtcG90ZW5jeSBpcyBlbmFibGVkLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBJZiBpZGVtcG90ZW5jeSBpcyBkaXNhYmxlZCwgUGxhaWQgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCBhIGA0MDAgQmFkIFJlcXVlc3RgIHN0YXR1cyBjb2RlIGlmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHN1cHBsaWVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2lkZW1wb3RlbnQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC4gSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHNoYXJlYWJsZSBVUkwgZmVhdHVyZSwgeW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlc2UgZmllbGRzIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbnN0ZWFkOyBib3RoIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYW5kIGAvbGluay90b2tlbi9jcmVhdGVgIGFyZSB2YWxpZCB3YXlzIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIGEgbm9uLWBudWxsYCB1c2VyIGRhdGEgb2JqZWN0IHZpYSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgLCBhbnkgdXNlciBkYXRhIGZpZWxkcyBlbnRlcmVkIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCB3aWxsIGJlIGlnbm9yZWQgd2hlbiBwcmVmaWxsaW5nIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5aW5nIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcHJvdmlkZSBgY2xpZW50X3VzZXJfaWRgIGF0IHRoZSByb290IGxldmVsIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IHJlcHJlc2VudHMgYSBjdXN0b21lclxcJ3MgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlaXIgaWRlbnRpdHksIHJlZmxlY3RpbmcgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciBjb21wbGV0aW5nIHRoZSBzZXNzaW9uLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBzdGVwLCBhbmQgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHRoZSBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFRoZSBhZGRyZXNzIG11c3QgYXQgbGVhc3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBiZSBhIHZhbGlkIGFkZHJlc3M6IGBzdHJlZXRgLCBgY2l0eWAsIGBjb3VudHJ5YC4gSWYgYW55IGFyZSBtaXNzaW5nIG9yIHVuYWJsZSB0byBiZSBleHRyYWN0ZWQsIHRoZSBhZGRyZXNzIHdpbGwgYmUgbnVsbC4gIGByZWdpb25gLCBhbmQgYHBvc3RhbF9jb2RlYCBtYXkgYmUgbnVsbCBiYXNlZCBvbiB0aGUgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlICBOb3RlOiBPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiAoT0NSKSB0ZWNobm9sb2d5IG1heSBzb21ldGltZXMgZXh0cmFjdCBpbmNvcnJlY3QgZGF0YSBmcm9tIGEgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENpdHkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluZGl2aWR1YWxcXCdzIG5hbWUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgUGxhaWQgc2Vzc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgc2Vzc2lvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6IEFycmF5PElkZW50aXR5VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogWW91IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBwcmUtcG9wdWxhdGUgdGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWU7IGlmIGl0IGlzIHByb3ZpZGVkIGhlcmUsIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGhhcyBub3Qgc3VibWl0dGVkIHRoZWlyIG5hbWUsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBPdGhlcndpc2UsIGJvdGggZmllbGRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHJldHJpZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVRSSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciByZXRyeWluZyBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHJhdGVneX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJhdGVneTogU3RyYXRlZ3k7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHN0ZXBzPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIHJldHJpZWQuIElmIGEgdmFsdWUgZm9yIHRoaXMgZmxhZyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgYGlzX3NoYXJlYWJsZWAgc2V0dGluZyBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJpZmljYXRpb24gYXR0ZW1wdCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfc2hhcmVhYmxlPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc3RydWN0aW9ucyBmb3IgdGhlIGBjdXN0b21gIHJldHJ5IHN0cmF0ZWd5IHNwZWNpZnlpbmcgd2hpY2ggc3RlcHMgc2hvdWxkIGJlIHJlcXVpcmVkIG9yIHNraXBwZWQuICAgTm90ZTogICBUaGlzIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQgd2hlbiB0aGUgcmV0cnkgc3RyYXRlZ3kgaXMgYGN1c3RvbWAgYW5kIG11c3QgYmUgb21pdHRlZCBvdGhlcndpc2UuICBDdXN0b20gcmV0cmllcyBvdmVycmlkZSBzZXR0aW5ncyBpbiB5b3VyIFBsYWlkIFRlbXBsYXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBQbGFpZCBUZW1wbGF0ZSBoYXMgYHZlcmlmeV9zbXNgIGRpc2FibGVkLCBhIGN1c3RvbSByZXRyeSB3aXRoIGB2ZXJpZnlfc21zYCBlbmFibGVkIHdpbGwgc3RpbGwgcmVxdWlyZSB0aGUgc3RlcC4gIFRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzYW5kYm94IHNlcnZlci4gU2FuZGJveCByZXF1ZXN0cyB3aWxsIHNpbGVudGx5IGRpc2FibGUgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAgd2hlbiBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGB2ZXJpZnlfc21zYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiAgIGBhY3RpdmVgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlzIGluY29tcGxldGUuIFRoZSB1c2VyIG1heSBoYXZlIGNvbXBsZXRlZCBwYXJ0IG9mIHRoZSBzZXNzaW9uLCBidXQgaGFzIG5laXRoZXIgZmFpbGVkIG9yIHBhc3NlZC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkLCBwYXNzaW5nIGFsbCBzdGVwcyBkZWZpbmVkIHRvIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgb25lIG9yIG1vcmUgc3RlcHMgaW4gdGhlIHNlc3Npb24gYW5kIHdhcyB0b2xkIHRvIGNvbnRhY3Qgc3VwcG9ydC4gIGBleHBpcmVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgYWN0aXZlIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgd2l0aG91dCBiZWluZyBjb21wbGV0ZWQgYW5kIHdhcyBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBleHBpcmVkLiBOb3RlIHRoYXQgc2Vzc2lvbnMgY3VycmVudGx5IGRvIG5vdCBleHBpcmUuIEF1dG9tYXRpYyBleHBpcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGVuYWJsZWQgaW4gdGhlIGZ1dHVyZS4gIGBjYW5jZWxlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGVkLCBlaXRoZXIgdmlhIHRoZSBkYXNoYm9hcmQgYnkgYSB1c2VyLCBvciB2aWEgQVBJLiBUaGUgdXNlciBtYXkgaGF2ZSBjb21wbGV0ZWQgcGFydCBvZiB0aGUgc2Vzc2lvbiwgYnV0IGhhcyBuZWl0aGVyIGZhaWxlZCBvciBwYXNzZWQuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBoYXMgYmVlbiB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIHZpYSB0aGUgZGFzaGJvYXJkIG9yIHRoZSBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzdGVwIGluIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBXYWl0aW5nRm9yUHJlcmVxdWlzaXRlID0gJ3dhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZScsXG4gICAgTm90QXBwbGljYWJsZSA9ICdub3RfYXBwbGljYWJsZScsXG4gICAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIENhbmNlbGVkID0gJ2NhbmNlbGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJyxcbiAgICBNYW51YWxseVJlamVjdGVkID0gJ21hbnVhbGx5X3JlamVjdGVkJ1xufVxuXG4vKipcbiAqIEVhY2ggc3RlcCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICBgYWN0aXZlYCAtIFRoaXMgc3RlcCBpcyB0aGUgdXNlclxcJ3MgY3VycmVudCBzdGVwLiBUaGV5IGFyZSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZyB0aGlzIHN0ZXAsIG9yIHRoZXkgcmVjZW50bHkgY2xvc2VkIHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdoaWxlIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBzdGVwLiBPbmx5IG9uZSBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBhY3RpdmVgIGF0IGFueSBnaXZlbiBwb2ludC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIHRoaXMgc3RlcC4gVGhpcyBjYW4gZWl0aGVyIGNhbGwgdGhlIHVzZXIgdG8gZmFpbCB0aGUgc2Vzc2lvbiBhcyBhIHdob2xlLCBvciBjYXVzZSB0aGVtIHRvIGZhbGxiYWNrIHRvIGFub3RoZXIgc3RlcCBkZXBlbmRpbmcgb24gaG93IHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUgaXMgY29uZmlndXJlZC4gQSBmYWlsZWQgc3RlcCBkb2VzIG5vdCBpbXBseSBhIGZhaWxlZCBzZXNzaW9uLiAgYHdhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZWAgLSBUaGUgdXNlciBuZWVkcyB0byBjb21wbGV0ZSBhbm90aGVyIHN0ZXAgZmlyc3QsIGJlZm9yZSB0aGV5IHByb2dyZXNzIHRvIHRoaXMgc3RlcC4gVGhpcyBzdGVwIG1heSBuZXZlciBydW4sIGRlcGVuZGluZyBvbiBpZiB0aGUgdXNlciBmYWlscyBhbiBlYXJsaWVyIHN0ZXAgb3IgaWYgdGhlIHN0ZXAgaXMgb25seSBydW4gYXMgYSBmYWxsYmFjay4gIGBub3RfYXBwbGljYWJsZWAgLSBUaGlzIHN0ZXAgd2lsbCBub3QgYmUgcnVuIGZvciB0aGlzIHNlc3Npb24uICBgc2tpcHBlZGAgLSBUaGUgcmV0cnkgaW5zdHJ1Y3Rpb25zIHRoYXQgY3JlYXRlZCB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHNwZWNpZmllZCB0aGF0IHRoaXMgc3RlcCBzaG91bGQgYmUgc2tpcHBlZC4gIGBleHBpcmVkYCAtIFRoaXMgc3RlcCBoYWQgbm90IHlldCBiZWVuIGNvbXBsZXRlZCB3aGVuIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhcyBhIHdob2xlIGV4cGlyZWQuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCBiZWZvcmUgdGhlIHVzZXIgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LiAgYG1hbnVhbGx5X2FwcHJvdmVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIHBhc3MgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLiAgYG1hbnVhbGx5X3JlamVjdGVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIGZhaWwgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGFjY2VwdF90b3M6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgY29tcGxldGVkIGEgc3RlcCBvZiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RFUF9VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgSUQgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZW1wbGF0ZSBjb25maWd1cmluZyB0aGUgYmVoYXZpb3Igb2YgYSBnaXZlbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGlkZW50aXR5IGRhdGEgdGhhdCB3YXMgZWl0aGVyIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyIG9yIHByb3ZpZGVkIHZpYSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBoaWdoIGxldmVsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGUgdXNlciBzdWJtaXR0ZWQuICBGb3IgZXhhbXBsZSwgYW4gaW1hZ2UgdGhhdCBpcyBibHVycnksIGRpc3RvcnRlZCBieSBnbGFyZSBmcm9tIGEgbmVhcmJ5IGxpZ2h0IHNvdXJjZSwgb3IgaW1wcm9wZXJseSBmcmFtZWQgbWlnaHQgYmUgbWFya2VkIGFzIGxvdyBvciBtZWRpdW0gcXVhbGl0eS4gUG9vciBxdWFsaXR5IGltYWdlcyBhcmUgbW9yZSBsaWtlbHkgdG8gZmFpbCBPQ1IgYW5kL29yIHRlbXBsYXRlIGNvbmZvcm1pdHkgY2hlY2tzLiAgTm90ZTogQnkgZGVmYXVsdCwgUGxhaWQgd2lsbCBsZXQgYSB1c2VyIHJlY2FwdHVyZSBkb2N1bWVudCBpbWFnZXMgdHdpY2UgYmVmb3JlIGZhaWxpbmcgdGhlIGVudGlyZSBzZXNzaW9uIGlmIHdlIGF0dHJpYnV0ZSB0aGUgZmFpbHVyZSB0byBsb3cgaW1hZ2UgcXVhbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eSB7XG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBMb3cgPSAnbG93J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGltYWdlIHF1YWxpdHkgb2YgdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbWFnZVF1YWxpdHlEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VRdWFsaXR5RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eU91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEltYWdlUXVhbGl0eURldGFpbHNcbiAgICAgKi9cbiAgICBnbGFyZV9jaGVjazogSW1hZ2VRdWFsaXR5T3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGRpbWVuc2lvbnNfY2hlY2s6IEltYWdlUXVhbGl0eU91dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eU91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEltYWdlUXVhbGl0eURldGFpbHNcbiAgICAgKi9cbiAgICBibHVyX2NoZWNrOiBJbWFnZVF1YWxpdHlPdXRjb21lO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgaW1hZ2UgcXVhbGl0eSBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eU91dGNvbWUge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiB1cGRhdGUgb24gdGhlIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgdXBkYXRlIHdhcyBwdWJsaXNoZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtIHtcbiAgICBJbnZlc3RpZ2F0aW5nID0gJ0lOVkVTVElHQVRJTkcnLFxuICAgIElkZW50aWZpZWQgPSAnSURFTlRJRklFRCcsXG4gICAgU2NoZWR1bGVkID0gJ1NDSEVEVUxFRCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnJlYWtkb3duIG9mIHRoZSBkaWZmZXJlbnQgaW5jb21lIHR5cGVzIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVCcmVha2Rvd25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBJbmNvbWVCcmVha2Rvd25UeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaG91cmx5IHJhdGUgYXQgd2hpY2ggdGhlIGluY29tZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBob3VycyBsb2dnZWQgZm9yIHRoaXMgaW5jb21lIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHBheSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpbmNvbWUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBcXFwicmVndWxhclxcXCJgOiByZWd1bGFyIGluY29tZSAgIGBcXFwib3ZlcnRpbWVcXFwiYDogb3ZlcnRpbWUgaW5jb21lICAgYFxcXCJib251c1xcXCJgOiBib251cyBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZUJyZWFrZG93blR5cGUge1xuICAgIEJvbnVzID0gJ2JvbnVzJyxcbiAgICBPdmVydGltZSA9ICdvdmVydGltZScsXG4gICAgUmVndWxhciA9ICdyZWd1bGFyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmeSBwYXlyb2xsIGRhdGEgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwYXlzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5c3R1YnM/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB3MnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxXMk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3MnM/OiBBcnJheTxXMk92ZXJyaWRlPjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVNvdXJjZXNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTb3VyY2VzQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIGRldGVjdGVkIGF0IHRoZSBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVNvdXJjZXNDb3VudHNcbiAgICAgKi9cbiAgICBiYXNlbGluZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgY3VycmVudGx5IGRldGVjdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU291cmNlc0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIHZlcmlmaWVkIGZpZWxkcyBmcm9tIGEgcGF5c3R1YiB2ZXJpZmljYXRpb24uIEFsbCBmaWVsZHMgYXJlIHByb3ZpZGVkIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZTogRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZWVfbmFtZTogRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX2dyb3NzX2luY29tZTogWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9uZXRfaW5jb21lOiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IFBheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHByb2plY3RlZF93YWdlOiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmaWVkX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaWVsZCBudW1iZXIgZm9yIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZW5kcG9pbnQgdG8gd2hpY2ggUGxhaWQgc2hvdWxkIHNlbmQgd2ViaG9va3MgcmVsYXRlZCB0byB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHByZWNoZWNrIGNyZWF0ZWQgd2l0aCBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLiBXaWxsIGJlIHVzZWQgdG8gaW1wcm92ZSBjb252ZXJzaW9uIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogT3B0aW9uYWwgYXJndW1lbnRzIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlIHByb2R1Y3QgZGF0YS4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGNvcnJlbGF0ZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gdGhlc2UgSXRlbXMgd2l0aCBkYXRhIGZyb20gdGhlIHVzZXJcXCdzIHBheXN0dWIsIHN1Y2ggYXMgZGF0ZSBhbmQgYW1vdW50LiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIExpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvcHRpb25zIHRvIGVuYWJsZSBmb3IgZG9jdW1lbnQgcGFyc2luZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZyB7XG4gICAgT2NyID0gJ29jcicsXG4gICAgUmlza1NpZ25hbHMgPSAncmlza19zaWduYWxzJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCBJRCB0byBkb3dubG9hZC4gSWYgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcgemlwIGZpbGUsIHJhdGhlciB0aGFuIGFsbCBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmxvdyB0eXBlcyB0byByZXRyaWV2ZSBwYXlyb2xsIGluY29tZSBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGUge1xuICAgIERpZ2l0YWxJbmNvbWUgPSAncGF5cm9sbF9kaWdpdGFsX2luY29tZScsXG4gICAgRG9jdW1lbnRJbmNvbWUgPSAncGF5cm9sbF9kb2N1bWVudF9pbmNvbWUnXG59XG5cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uIGZvciB3aGljaCB0byBnZXQgcGF5c3R1YiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBNZXRhZGF0YSBmb3IgYW4gaW5jb21lIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5c3R1YnM6IEFycmF5PFBheXN0dWI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNvbmZpZGVuY2UgdGhhdCBQbGFpZCBjYW4gc3VwcG9ydCB0aGUgdXNlciBpbiB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBtYW51YWwgcGF5c3R1YiB1cGxvYWQuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJISUdIXFxcImA6IEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgXFxcImBMT1dgXFxcIjogSXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIHVzZXIgY2FuIHVzZSB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuICBgXFxcIlVOS05PV05cXFwiYDogSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIHVzZXIgaXMgc3VwcG9ydGFibGUgd2l0aCB0aGUgaW5mb3JtYXRpb24gcGFzc2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIExvdyA9ICdMT1cnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIHRheCBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICB0YXhfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBlbXBsb3llclxcJ3MgcHVibGljIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgbWlsaXRhcnkgaW5mbyBpbiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcmVjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mbyB7XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHVzZXIgY3VycmVudGx5IGFjdGl2ZSBkdXR5IGluIHRoZSBVUyBtaWxpdGFyeVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGlzX2FjdGl2ZV9kdXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlcnZpbmcgaW4gdGhlIFVTIG1pbGl0YXJ5LCB0aGUgYnJhbmNoIG9mIHRoZSBtaWxpdGFyeSBpbiB3aGljaCB0aGV5IGFyZSBzZXJ2aW5nIFZhbGlkIHZhbHVlczogXFwnQUlSIEZPUkNFXFwnLCBcXCdBUk1ZXFwnLCBcXCdDT0FTVCBHVUFSRFxcJywgXFwnTUFSSU5FU1xcJywgXFwnTkFWWVxcJywgXFwnVU5LTk9XTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gICAgICovXG4gICAgYnJhbmNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBwYXlyb2xsIGluc3RpdHV0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHBheXJvbGwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5cm9sbF9pbnN0aXR1dGlvbj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcHJlY2hlY2suIFByb3ZpZGUgdGhpcyB2YWx1ZSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW4gb3JkZXIgdG8gb3B0aW1pemUgTGluayBjb252ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmVjaGVja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBob21lX2FkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIGF0dGVtcHQgdG8gcmVmcmVzaCBQYXlyb2xsIEluY29tZSBkYXRhIGZvciBhIHVzZXIgdmlhIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIGZhaWxlZCBiZWNhdXNlIHRoZSB1c2VyIG11c3QgcmUtY29ubmVjdCB0aGVpciBwYXlyb2xsIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SRUZSRVNIX1JFQ09OTkVDVF9ORUVERURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmlzayBzaWduYWxzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGRvY3VtZW50cyB1cGxvYWRlZCB2aWEgRG9jdW1lbnQgSW5jb21lLiBJdCB3aWxsIHR5cGljYWxseSB0YWtlIGEgbWludXRlIG9yIHR3byBmb3IgdGhpcyB3ZWJob29rIHRvIGZpcmUgYWZ0ZXIgdGhlIGVuZCB1c2VyIGhhcyB1cGxvYWRlZCB0aGVpciBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIG1heSB0aGVuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBhbmQgdG8gcmV0cmlldmUgcmlzayBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiSU5DT01FXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUklTS19TSUdOQUxTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmcmF1ZCBkZXRlY3Rpb24gcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGFsbCByaXNrIHNpZ25hbCBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsc19zdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSBoYXMgY2hhbmdlZC4gVGhpcyB3ZWJob29rIGlzIGZpcmVkIGZvciBib3RoIHRoZSBEb2N1bWVudCBhbmQgUGF5cm9sbCBJbmNvbWUgZmxvd3MsIGJ1dCBub3QgdGhlIEJhbmsgSW5jb21lIGZsb3cuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5QYXJlbnQgY29udGFpbmVyIGZvciBuYW1lIHRoYXQgYWxsb3dzIGZvciBjaG9pY2UgZ3JvdXAgYmV0d2VlbiBwYXJzZWQgYW5kIHVucGFyc2VkIGNvbnRhaW5lcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIExhc3ROYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwsIGluY2x1ZGluZyBhbGwgcGFydHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgbmFtZXMgYXJlIHRob3NlIG1vc3QgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byB0aGlzIHBlcnNvbi4gT25seSBvbmUgbmFtZSB3aWxsIGV2ZXIgYmUgbWFya2VkIGFzIHByaW1hcnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIHdlYWtfYWxpYXNfZGV0ZXJtaW5hdGlvbjogV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbjtcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGluZGl2aWR1YWxzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX0NJQWA6IENJQSBMaXN0IG9mIENoaWVmcyBvZiBTdGF0ZSBhbmQgQ2FiaW5ldCBNZW1iZXJzICBgSVpfSVBMYDogSW50ZXJwb2wgUmVkIE5vdGljZXMgZm9yIFdhbnRlZCBQZXJzb25zIExpc3QgIGBJWl9QRVBgOiBQb2xpdGljYWxseSBFeHBvc2VkIFBlcnNvbnMgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVS19ITUNgOiBVSyBITSBUcmVhc3VyeSBDb25zb2xpZGF0ZWQgTGlzdCAgYFVTX0RQTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgRGVuaWVkIFBlcnNvbnMgTGlzdCAgYFVTX0RUQ2A6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgQUVDQSBEZWJhcnJlZCAgYFVTX0ZCSWA6IFVTIERlcGFydG1lbnQgb2YgSnVzdGljZSBGQkkgV2FudGVkIExpc3QgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19JU05gOiBVUyBEZXBhcnRtZW50IG9mIFN0YXRlIE5vbnByb2xpZmVyYXRpb24gU2FuY3Rpb25zICBgVVNfUExDYDogVVMgT0ZBQyBQYWxlc3RpbmlhbiBMZWdpc2xhdGl2ZSBDb3VuY2lsICBgVVNfU0ROYDogVVMgT0ZBQyBTcGVjaWFsbHkgRGVzaWduYXRlZCBOYXRpb25hbHMgTGlzdCAgYFVTX1NTSWA6IFVTIE9GQUMgU2VjdG9yYWwgU2FuY3Rpb25zIElkZW50aWZpY2F0aW9ucyAgYFNHX1NPRmA6IEdvdmVybm1lbnQgb2YgU2luZ2Fwb3JlIFRlcnJvcmlzdHMgYW5kIFRlcnJvcmlzdCBFbnRpdGllcyAgYFRSX1RXTGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFRlcnJvcmlzdCBXYW50ZWQgTGlzdCAgYFRSX0RGRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IERvbWVzdGljIEZyZWV6aW5nIERlY2lzaW9ucyAgYFRSX0ZPUmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IEZvcmVpZ24gRnJlZXppbmcgUmVxdWVzdHMgIGBUUl9XTURgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBXZWFwb25zIG9mIE1hc3MgRGVzdHJ1Y3Rpb24gIGBUUl9DTUJgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBDYXBpdGFsIE1hcmtldHMgQm9hcmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlIHtcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJekNpYSA9ICdJWl9DSUEnLFxuICAgIEl6SXBsID0gJ0laX0lQTCcsXG4gICAgSXpQZXAgPSAnSVpfUEVQJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVWtIbWMgPSAnVUtfSE1DJyxcbiAgICBVc0RwbCA9ICdVU19EUEwnLFxuICAgIFVzRHRjID0gJ1VTX0RUQycsXG4gICAgVXNGYmkgPSAnVVNfRkJJJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzSXNuID0gJ1VTX0lTTicsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1BsYyA9ICdVU19QTEMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBTZ1NvZiA9ICdTR19TT0YnLFxuICAgIFRyVHdsID0gJ1RSX1RXTCcsXG4gICAgVHJEZmQgPSAnVFJfREZEJyxcbiAgICBUckZvciA9ICdUUl9GT1InLFxuICAgIFRyV21kID0gJ1RSX1dNRCcsXG4gICAgVHJDbWIgPSAnVFJfQ01CJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2UgcmVndWxhciBwYXltZW50cyBvbiBhIGxvYW4uIEFueSB0cmFuc2FjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBgaW5mbG93X21vZGVsYCB3aWxsIGFwcGVhciBpbiBhZGRpdGlvbiB0byByYW5kb21seSBnZW5lcmF0ZWQgdGVzdCBkYXRhIG9yIHRyYW5zYWN0aW9ucyBzcGVjaWZpZWQgYnkgYG92ZXJyaWRlX2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5mbG93TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZsb3dNb2RlbCB7XG4gICAgLyoqXG4gICAgICogSW5mbG93IG1vZGVsLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBub25lYDogTm8gaW5jb21lICBgbW9udGhseS1pbmNvbWVgOiBJbmNvbWUgb2NjdXJzIG9uY2UgcGVyIG1vbnRoIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGA6IFBheXMgb2ZmIHRoZSBiYWxhbmNlIG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgOiBNYWtlcyBhbiBpbnRlcmVzdC1vbmx5IHBheW1lbnQgb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIE5vdGUgdGhhdCBhY2NvdW50IHR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcyB3aWxsIGFjY3J1ZSBpbnRlcmVzdCBpbiB0aGUgU2FuZGJveC4gVGhlIHR5cGVzIGltcGFjdGVkIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBzdWJ0eXBlIGBjcmVkaXRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGluY29tZSBwZXIgbW9udGguIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBpbmNvbWVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24gd2lsbCBhcHBlYXIuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHBheW1lbnRfZGF5X29mX21vbnRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgYmFsYW5jZSBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRfZGF5X29mX21vbnRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gVGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERldGFpbHMgcmVsYXRpbmcgdG8gYSBzcGVjaWZpYyBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIG1heSBoYXZlIG11bHRpcGxlIHJlY29yZHMsIGVhY2ggd2l0aCBkaWZmZXJlbnQgaW5zdGl0dXRpb24gSURzOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RpdHV0aW9uIGhhcyBtaWdyYXRlZCB0byBPQXV0aCwgdGhlcmUgbWF5IGJlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciB0aGUgT0F1dGggYW5kIG5vbi1PQXV0aCB2ZXJzaW9ucyBvZiB0aGUgaW5zdGl0dXRpb24uIEluc3RpdHV0aW9ucyB0aGF0IG9wZXJhdGUgaW4gZGlmZmVyZW50IGNvdW50cmllcyBvciB3aXRoIG11bHRpcGxlIGxvZ2luIHBvcnRhbHMgbWF5IGFsc28gaGF2ZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgZWFjaCBjb3VudHJ5IG9yIHBvcnRhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgUGxhaWQgcHJvZHVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IG9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IEF1dGggd2lsbCByZXR1cm4gYGF1dGhgIGluIHRoZSBwcm9kdWN0IGFycmF5OyBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgbGlzdCBgYXV0aGAgbWF5IHN0aWxsIHN1cHBvcnQgb3RoZXIgQXV0aCBtZXRob2RzIHN1Y2ggYXMgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBWZXJpZmljYXRpb24uIFRvIGlkZW50aWZ5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgbWV0aG9kcywgdXNlIHRoZSBgYXV0aF9tZXRhZGF0YWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0Z1bGwgQXV0aCBjb3ZlcmFnZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcHJvZHVjdCBoZXJlIGluZGljYXRlcyBzdXBwb3J0IGZvciBCYW5rIEluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGtub3duIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBpbmNsdWRlX3N0YXR1c2Agb3B0aW9uIHNldCB0byB0cnVlLiBOb3RlIHRoYXQgaW5zdGl0dXRpb24gc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpdGVtX2xvZ2lucz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgYXV0aD86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiByZWNlbnQgaGVhbHRoIGluY2lkZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxIZWFsdGhJbmNpZGVudD59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaGVhbHRoX2luY2lkZW50cz86IEFycmF5PEhlYWx0aEluY2lkZW50PiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaW5zdGl0dXRpb24gc3RhdHVzIG1lZXRzIHRoZSBjb25kaXRpb25zIGNvbmZpZ3VyZWQgaW4gdGhlIGRldmVsb3BlciBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBEQVNIQk9BUkRfQ09ORklHVVJFRF9BTEVSVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNUSVRVVElPTl9TVEFUVVNfQUxFUlRfVFJJR0dFUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZ2xvYmFsIHN1Y2Nlc3MgcmF0ZSBvZiB0aGUgaW5zdGl0dXRpb24sIGNhbGN1bGF0ZWQgYmFzZWQgb24gaXRlbSBhZGQgaGVhbHRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fb3ZlcmFsbF9zdWNjZXNzX3JhdGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBSVFAgYW5kIFJmUCBuZXR3b3JrIGFuZCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUH1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICAgICAqL1xuICAgIHJ0cDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFA7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzXG4gICAgICovXG4gICAgcmZwOiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0byBnZXQgZGV0YWlscyBhYm91dFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiBhbiBpbnN0aXR1dGlvblxcJ3MgbG9nbywgYnJhbmQgY29sb3IsIGFuZCBVUkwuIFdoZW4gYXZhaWxhYmxlLCB0aGUgYmFua1xcJ3MgbG9nbyBpcyByZXR1cm5lZCBhcyBhIGJhc2U2NCBlbmNvZGVkIDE1MngxNTIgUE5HLCB0aGUgYnJhbmQgY29sb3IgaXMgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RpdHV0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfc3RhdHVzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogSW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIEluc3RpdHV0aW9ucyB0byBza2lwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiAgSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoaWNoIHByb2R1Y3RzIHRoZXkgc3VwcG9ydC4gV2lsbCBvbmx5IHJldHVybiBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IGFsbCBsaXN0ZWQgcHJvZHVjdHMuIFdoZW4gZmlsdGVyaW5nIGJhc2VkIG9uIGBhdXRoYCwgYW4gaW5zdGl0dXRpb24gbXVzdCBzdXBwb3J0IEluc3RhbnQgQXV0aCB0byBtYXRjaCB0aGUgY3JpdGVyaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2Ygcm91dGluZyBudW1iZXJzIHRvIGZpbHRlciBpbnN0aXR1dGlvbnMuIFRoZSByZXNwb25zZSB3aWxsIG9ubHkgcmV0dXJuIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIGFsbCBvZiB0aGUgcm91dGluZyBudW1iZXJzIGluIHRoZSBhcnJheS4gUm91dGluZyBudW1iZXIgcmVjb3JkcyB1c2VkIGZvciB0aGlzIG1hdGNoaW5nIGFyZSBnZW5lcmFsbHkgY29tcHJlaGVuc2l2ZTsgaG93ZXZlciwgZmFpbHVyZSB0byBtYXRjaCBhIGdpdmVuIHJvdXRpbmcgbnVtYmVyIHRvIGFuIGluc3RpdHV0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUgaW5zdGl0dXRpb24gaXMgdW5zdXBwb3J0ZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXJzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBOb3RlIHRoYXQgaW5zdGl0dXRpb25zIHdpbGwgaGF2ZSBgb2F1dGhgIHNldCB0byBgdHJ1ZWAgaWYgc29tZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQgdG8gdXNlIE9BdXRoIGZsb3dzOyBpbnN0aXR1dGlvbnMgaW4gYSBzdGF0ZSBvZiBtaWdyYXRpb24gdG8gT0F1dGggd2lsbCBoYXZlIHRoZSBgb2F1dGhgIGF0dHJpYnV0ZSBzZXQgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci4gTm90IGFsbCBpbnN0aXR1dGlvbnNcXCcgbG9nb3MgYXJlIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBQbGFpZCBkb2VzIG5vdCBvd24gYW55IG9mIHRoZSBsb2dvcyBzaGFyZWQgYnkgdGhlIEFQSSwgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBQbGFpZCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSB2aWEgdGhpcyBlbmRwb2ludFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGFjY291bnQgZmlsdGVyIHRvIGFwcGx5IHRvIGluc3RpdHV0aW9ucyBzZWFyY2ggcmVxdWVzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgaW5zdGl0dXRpb25zIGJ5IHZhcmlvdXMgUGF5bWVudCBJbml0aWF0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeS4gSW5zdGl0dXRpb25zIHdpdGggbmFtZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IGFyZSByZXR1cm5lZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBzdXBwb3J0IGFsbCBwcm9kdWN0cyBsaXN0ZWQgaW4gYHByb2R1Y3RzYC4gUHJvdmlkZSBgbnVsbGAgdG8gZ2V0IGluc3RpdHV0aW9ucyByZWdhcmRsZXNzIG9mIHN1cHBvcnRlZCBwcm9kdWN0cy4gTm90ZSB0aGF0IHdoZW4gYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGlmIHlvdSBhcmUgZW5hYmxlZCBmb3IgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMsIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgcHJvZHVjdHMgd2lsbCBiZSByZXR1cm5lZCBldmVuIGlmIGBhdXRoYCBpcyBub3QgcHJlc2VudCBpbiB0aGVpciBwcm9kdWN0IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gTm90ZSB0aGF0IGluc3RpdHV0aW9ucyB3aWxsIGhhdmUgYG9hdXRoYCBzZXQgdG8gYHRydWVgIGlmIHNvbWUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5zdGl0dXRpb24gYXJlIHJlcXVpcmVkIHRvIHVzZSBPQXV0aCBmbG93czsgaW5zdGl0dXRpb25zIGluIGEgc3RhdGUgb2YgbWlncmF0aW9uIHRvIE9BdXRoIHdpbGwgaGF2ZSB0aGUgYG9hdXRoYCBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL3NlYXJjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5zdGl0dXRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWludmVzdG1lbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgXzQwMWEgPSAnNDAxYScsXG4gICAgXzQwMWsgPSAnNDAxaycsXG4gICAgXzQwM0IgPSAnNDAzQicsXG4gICAgXzQ1N2IgPSAnNDU3YicsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgQ3J5cHRvRXhjaGFuZ2UgPSAnY3J5cHRvIGV4Y2hhbmdlJyxcbiAgICBFZHVjYXRpb25TYXZpbmdzQWNjb3VudCA9ICdlZHVjYXRpb24gc2F2aW5ncyBhY2NvdW50JyxcbiAgICBGaXhlZEFubnVpdHkgPSAnZml4ZWQgYW5udWl0eScsXG4gICAgR2ljID0gJ2dpYycsXG4gICAgSGVhbHRoUmVpbWJ1cnNlbWVudEFycmFuZ2VtZW50ID0gJ2hlYWx0aCByZWltYnVyc2VtZW50IGFycmFuZ2VtZW50JyxcbiAgICBIc2EgPSAnaHNhJyxcbiAgICBJcmEgPSAnaXJhJyxcbiAgICBJc2EgPSAnaXNhJyxcbiAgICBLZW9naCA9ICdrZW9naCcsXG4gICAgTGlmID0gJ2xpZicsXG4gICAgTGlmZUluc3VyYW5jZSA9ICdsaWZlIGluc3VyYW5jZScsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTXV0dWFsRnVuZCA9ICdtdXR1YWwgZnVuZCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBRc2hyID0gJ3FzaHInLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJsaWYgPSAncmxpZicsXG4gICAgUm90aCA9ICdyb3RoJyxcbiAgICBSb3RoNDAxayA9ICdyb3RoIDQwMWsnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUnJzcCA9ICdycnNwJyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eScsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsZWdhY3kgZmllbGQgZm9ybWVybHkgdXNlZCBpbnRlcm5hbGx5IGJ5IFBsYWlkIHRvIGlkZW50aWZ5IGNlcnRhaW4gY2FuY2VsZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2FuY2VsX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbuKAmXMgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSBmb3IgYnV5IHRyYW5zYWN0aW9uczsgbmVnYXRpdmUgZm9yIHNlbGwgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBsZXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBkZWJpdGVkLCBlLmcuIHB1cmNoYXNlcyBvZiBzdG9jazsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBjcmVkaXRlZCwgZS5nLiBzYWxlcyBvZiBzdG9jay4gVHJlYXRtZW50IHJlbWFpbnMgdGhlIHNhbWUgZm9yIGNhc2gtb25seSBtb3ZlbWVudHMgdW5hc3NvY2lhdGVkIHdpdGggc2VjdXJpdGllcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmVlczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlIHtcbiAgICBBY2NvdW50RmVlID0gJ2FjY291bnQgZmVlJyxcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEFzc2lnbm1lbnQgPSAnYXNzaWdubWVudCcsXG4gICAgQnV5ID0gJ2J1eScsXG4gICAgQnV5VG9Db3ZlciA9ICdidXkgdG8gY292ZXInLFxuICAgIENvbnRyaWJ1dGlvbiA9ICdjb250cmlidXRpb24nLFxuICAgIERlcG9zaXQgPSAnZGVwb3NpdCcsXG4gICAgRGlzdHJpYnV0aW9uID0gJ2Rpc3RyaWJ1dGlvbicsXG4gICAgRGl2aWRlbmQgPSAnZGl2aWRlbmQnLFxuICAgIERpdmlkZW5kUmVpbnZlc3RtZW50ID0gJ2RpdmlkZW5kIHJlaW52ZXN0bWVudCcsXG4gICAgRXhlcmNpc2UgPSAnZXhlcmNpc2UnLFxuICAgIEV4cGlyZSA9ICdleHBpcmUnLFxuICAgIEZ1bmRGZWUgPSAnZnVuZCBmZWUnLFxuICAgIEludGVyZXN0ID0gJ2ludGVyZXN0JyxcbiAgICBJbnRlcmVzdFJlY2VpdmFibGUgPSAnaW50ZXJlc3QgcmVjZWl2YWJsZScsXG4gICAgSW50ZXJlc3RSZWludmVzdG1lbnQgPSAnaW50ZXJlc3QgcmVpbnZlc3RtZW50JyxcbiAgICBMZWdhbEZlZSA9ICdsZWdhbCBmZWUnLFxuICAgIExvYW5QYXltZW50ID0gJ2xvYW4gcGF5bWVudCcsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpbiA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBMb25nVGVybUNhcGl0YWxHYWluUmVpbnZlc3RtZW50ID0gJ2xvbmctdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBNYW5hZ2VtZW50RmVlID0gJ21hbmFnZW1lbnQgZmVlJyxcbiAgICBNYXJnaW5FeHBlbnNlID0gJ21hcmdpbiBleHBlbnNlJyxcbiAgICBNZXJnZXIgPSAnbWVyZ2VyJyxcbiAgICBNaXNjZWxsYW5lb3VzRmVlID0gJ21pc2NlbGxhbmVvdXMgZmVlJyxcbiAgICBOb25RdWFsaWZpZWREaXZpZGVuZCA9ICdub24tcXVhbGlmaWVkIGRpdmlkZW5kJyxcbiAgICBOb25SZXNpZGVudFRheCA9ICdub24tcmVzaWRlbnQgdGF4JyxcbiAgICBQZW5kaW5nQ3JlZGl0ID0gJ3BlbmRpbmcgY3JlZGl0JyxcbiAgICBQZW5kaW5nRGViaXQgPSAncGVuZGluZyBkZWJpdCcsXG4gICAgUXVhbGlmaWVkRGl2aWRlbmQgPSAncXVhbGlmaWVkIGRpdmlkZW5kJyxcbiAgICBSZWJhbGFuY2UgPSAncmViYWxhbmNlJyxcbiAgICBSZXR1cm5PZlByaW5jaXBhbCA9ICdyZXR1cm4gb2YgcHJpbmNpcGFsJyxcbiAgICBSZXF1ZXN0ID0gJ3JlcXVlc3QnLFxuICAgIFNlbGwgPSAnc2VsbCcsXG4gICAgU2VsbFNob3J0ID0gJ3NlbGwgc2hvcnQnLFxuICAgIFNlbmQgPSAnc2VuZCcsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW4gPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4nLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluUmVpbnZlc3RtZW50ID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgU3Bpbk9mZiA9ICdzcGluIG9mZicsXG4gICAgU3BsaXQgPSAnc3BsaXQnLFxuICAgIFN0b2NrRGlzdHJpYnV0aW9uID0gJ3N0b2NrIGRpc3RyaWJ1dGlvbicsXG4gICAgVGF4ID0gJ3RheCcsXG4gICAgVGF4V2l0aGhlbGQgPSAndGF4IHdpdGhoZWxkJyxcbiAgICBUcmFkZSA9ICd0cmFkZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInLFxuICAgIFRyYW5zZmVyRmVlID0gJ3RyYW5zZmVyIGZlZScsXG4gICAgVHJ1c3RGZWUgPSAndHJ1c3QgZmVlJyxcbiAgICBVbnF1YWxpZmllZEdhaW4gPSAndW5xdWFsaWZpZWQgZ2FpbicsXG4gICAgV2l0aGRyYXdhbCA9ICd3aXRoZHJhd2FsJ1xufVxuXG4vKipcbiAqIFZhbHVlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBgYnV5YDogQnV5aW5nIGFuIGludmVzdG1lbnQgYHNlbGxgOiBTZWxsaW5nIGFuIGludmVzdG1lbnQgYGNhbmNlbGA6IEEgY2FuY2VsbGF0aW9uIG9mIGEgcGVuZGluZyB0cmFuc2FjdGlvbiBgY2FzaGA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uIGBmZWVgOiBBIGZlZSBvbiB0aGUgYWNjb3VudCBgdHJhbnNmZXJgOiBBY3Rpdml0eSB3aGljaCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXIgIEZvciBkZXNjcmlwdGlvbnMgb2YgcG9zc2libGUgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtJbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2ludmVzdG1lbnQtdHJhbnNhY3Rpb24tdHlwZXMtc2NoZW1hKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUge1xuICAgIEJ1eSA9ICdidXknLFxuICAgIFNlbGwgPSAnc2VsbCcsXG4gICAgQ2FuY2VsID0gJ2NhbmNlbCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBGZWUgPSAnZmVlJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2Zlcidcbn1cblxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIGZvciB0aGUgNDAxayBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIG1vc3QgcmVjZW50IGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgZm9yIHRoZSA0MDFrIGFjY291bnQuIEluY2x1ZGVzIGFsbCBjb250cmlidXRpb25zIG1hZGUgb24gdGhlIHNhbWUgZGF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGxhc3RfY29udHJpYnV0aW9uX3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCBtb250aC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9jb3VudF8xbTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiB0aGUgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCBtb250aC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9hbW91bnRfMW06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9jb3VudF82bTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiB0aGUgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9hbW91bnRfNm06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fY291bnRfMTJtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIHRoZSBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9hbW91bnRfMTJtOiBudW1iZXI7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIGFjY291bnQgZmVlIHRyYW5zYWN0aW9ucyBmb3IgdGhlIDQwMWsgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGFjY291bnQgZmVlIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZlZV9jb3VudF8xMm06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgYWNjb3VudCBmZWUgdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlsc1xuICAgICAqL1xuICAgIGFjY291bnRfZmVlX2Ftb3VudF8xMm06IG51bWJlcjtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBhY2NvdW50IGZlZSBhbmQgY29udHJpYnV0aW9uIGluZm9ybWF0aW9uIGZvciA0MDFrIHR5cGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxa1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxayB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSA0MDFrIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxa1xuICAgICAqL1xuICAgIGZlZV9kZXRhaWxzPzogSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWtcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fZGV0YWlscz86IEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzO1xufVxuLyoqXG4gKiBPYmplY3Qgd2l0aCBtZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBzb3VyY2Ugb2YgZGF0YSBmb3IgdGhlIGFjY291bnQgbnVtYmVycywgb3duZXJzLCBhbmQgaG9sZGluZ3MgdGhhdCBhcmUgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAgICAgKi9cbiAgICBudW1iZXJzPzogRGF0YVNvdXJjZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICAgICAqL1xuICAgIG93bmVycz86IERhdGFTb3VyY2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAgICAgKi9cbiAgICBob2xkaW5ncz86IERhdGFTb3VyY2VzO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FDQVRTPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGFjYXRzPzogQXJyYXk8TnVtYmVyc0FDQVRTPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FUT04+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYXRvbj86IEFycmF5PE51bWJlcnNBVE9OPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc1JldGlyZW1lbnQ0MDFrPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIHJldGlyZW1lbnRfNDAxaz86IEFycmF5PE51bWJlcnNSZXRpcmVtZW50NDAxaz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lcnMgZm9yIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0YV9zb3VyY2VzOiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlcztcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhY2NvdW50cyBvZiA0MDFrIHN1YnR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxaz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9kZXRhaWxzXzQwMWs/OiBBcnJheTxJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWs+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiB0aGUgb3duZXJzaGlwIG9mIGFuIGludmVzdG1lbnRzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBpZGVudGl0eSBpbmZvcm1hdGlvbiBwZXJ0YWlucyB0b1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aE93bmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aE93bmVyXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNhbmNlbGVkIHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGNhbmNlbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBhZnRlciBhbiBhc3luY2hyb25vdXMgZXh0cmFjdGlvbiBvbiBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgSXRlbVxcJ3MgcG9ydGZvbGlvIHdhcyBtYW51YWxseSBjcmVhdGVkIHdpdGggdGhlIEludmVzdG1lbnRzIEZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAgd2hlbiBmZXRjaGluZyB0cmFuc2FjdGlvbiBoaXN0b3J5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGludmVzdG1lbnRzIHByb2R1Y3QgdmlhIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYG9wdGlvbmFsX3Byb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGluaXRpYWwgSW52ZXN0bWVudHMgZXh0cmFjdGlvbiB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4gUGxhaWQgd2lsbCBzdWJzZXF1ZW50bHkgZmlyZSBhIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aGVuIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy4gV2hlbiBgZmFsc2VgLCBQbGFpZCB3aWxsIHdhaXQgdG8gcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgZXh0cmFjdGlvbiBjb21wbGV0aW9uIGFuZCBubyBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2lsbCBmaXJlLiBOb3RlIHRoYXQgd2hpbGUgdGhlIGV4dHJhY3Rpb24gaXMgaGFwcGVuaW5nIGFzeW5jaHJvbm91c2x5LCBjYWxscyB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIHdpbGwgcmV0dXJuIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3JzIHVudGlsIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFzeW5jX3VwZGF0ZT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBiZWluZyBmZXRjaGVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogUG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIE11c3QgYmUgcG9zaXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBidXkgYW5kIG5lZ2F0aXZlIGlmIHRoZSB0eXBlIGlzIGEgc2VsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZmVlcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eT86IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGFuIGlzc3VlIGVuY291bnRlcmVkIHdpdGggZmluYW5jaWFsIGluc3RpdHV0aW9ucyBpbnRlcmFjdGlvbnMgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGR1cmluZyBMaW5raW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3VlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgaXNzdWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFmZmVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaWRzIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFmZmVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHJlY29yZCB0cmFja2luZyB0aGlzIGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSBzdW1tYXJ5IG9mIHRoZSBlcnJvciBmb3IgdGhlIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgc3VtbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gZm9yIHRoZSBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGRldGFpbGVkX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1ZXNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgc3RhdHVzPzogSXNzdWVzU3RhdHVzO1xufVxuLyoqXG4gKiBXZWJob29rIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgb25seSB3aGVuIGEgc3Vic2NyaWJlZCBpc3N1ZSBpcyBtYXJrZWQgYXMgcmVzb2x2ZWQuIFRoZSBwYXlsb2FkIGNvbnRhaW5zIGRldGFpbHMgYWJvdXQgdGhlIGlzc3VlIGF0IHRoZSB0aW1lIG9mIGl0cyByZXNvbHV0aW9uLCBmb2N1c2luZyBvbiB0aGUgbW9zdCBlc3NlbnRpYWwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVSZXNvbHZlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJU1NVRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSVNTVUVfUkVTT0xWRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbm5lY3Rpdml0eSBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGlzc3VlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIGZvciB0aGUgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpc3N1ZV9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIGlzc3VlIHdhcyBtYXJrZWQgYXMgcmVzb2x2ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpc3N1ZV9yZXNvbHZlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGludm9sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGludm9sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lzc3Vlcy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaXNzdWUgdG8gcmV0cmlldmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlzc3VlX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lzc3VlfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzc3VlPzogSXNzdWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pc3N1ZXMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgUGxhaWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZXF1ZXN0X2lkYCBmb3IgdGhlIExpbmsgc2Vzc2lvbiB0aGF0IG1pZ2h0IGhhdmUgaGFkIGFuIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24gaXNzdWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9yZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXNzdWVzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBpc3N1ZXMgYWZmZWN0aW5nIHRoZSBJdGVtLCBzZXNzaW9uLCBvciByZXF1ZXN0IHBhc3NlZCBpbiwgY29uZm9ybWluZyB0byB0aGUgSXNzdWVzIGRhdGEgbW9kZWwuIEFuIGVtcHR5IGxpc3QgaW5kaWNhdGVzIHRoYXQgbm8gbWF0Y2hpbmcgaXNzdWVzIHdlcmUgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PElzc3VlPn1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc3N1ZXM/OiBBcnJheTxJc3N1ZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBpc3N1ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElzc3Vlc1N0YXR1cyB7XG4gICAgUmVwb3J0ZWQgPSAnUkVQT1JURUQnLFxuICAgIEF3YWl0aW5nUmVzb2x1dGlvbiA9ICdBV0FJVElOR19SRVNPTFVUSU9OJyxcbiAgICBGaXhJblByb2dyZXNzID0gJ0ZJWF9JTl9QUk9HUkVTUycsXG4gICAgRml4UGVuZGluZ1ZhbGlkYXRpb24gPSAnRklYX1BFTkRJTkdfVkFMSURBVElPTicsXG4gICAgQ2Fubm90Rml4ID0gJ0NBTk5PVF9GSVgnLFxuICAgIFJlc29sdmVkID0gJ1JFU09MVkVEJ1xufVxuXG4vKipcbiAqIElzc3Vlc1N1YnNjcmliZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXNzdWVzL3N1YnNjcmliZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpc3N1ZSB0byBzdWJzY3JpYmUgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzc3VlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgVVJMIHdoZXJlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlIHNlbnQgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvc3Vic2NyaWJlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJpbmFyeSBtYXRjaCBpbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBjb3VudHJ5IHRoYXQgaXNzdWVkIHRoZSBwcm92aWRlZCBkb2N1bWVudCBtYXRjaGVzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgc2VwYXJhdGVseSBwcm92aWRlZCB0byBQbGFpZC4gIE5vdGU6IFlvdSBjYW4gY29uZmlndXJlIHdoZXRoZXIgYSBgbm9fbWF0Y2hgIG9uIGBpc3N1aW5nX2NvdW50cnlgIGZhaWxzIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBieSBlZGl0aW5nIHlvdXIgUGxhaWQgVGVtcGxhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJc3N1aW5nQ291bnRyeSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB3aXRob3V0IGFuIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24sIHN1Y2ggYXMgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUF1dGhNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdXRoX21ldGhvZD86IEl0ZW1BdXRoTWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXZhaWxhYmxlX3Byb2R1Y3RzYC4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gQWxzbyBub3RlIHRoYXQgcHJvZHVjdHMgdGhhdCBhcmUgYmlsbGVkIG9uIGEgcGF5LXBlci1jYWxsIGJhc2lzIHJhdGhlciB0aGFuIGEgcGF5LXBlci1JdGVtIGJhc2lzLCBzdWNoIGFzIGBiYWxhbmNlYCwgd2lsbCBub3QgYXBwZWFyIGhlcmUuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBiaWxsZWRfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYWRkZWQgdG8gdGhlIEl0ZW0uIEluIGFsbW9zdCBhbGwgY2FzZXMsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgYGJpbGxlZF9wcm9kdWN0c2AgZmllbGQuIEZvciBzb21lIHByb2R1Y3RzLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHByb2R1Y3QgdG8gYmUgYWRkZWQgdG8gYW4gSXRlbSBidXQgbm90IHlldCBiaWxsZWQgKGUuZy4gQXNzZXRzLCBiZWZvcmUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBoYXMgYmVlbiBjYWxsZWQsIG9yIEF1dGggb3IgSWRlbnRpdHkgd2hlbiBhZGRlZCBhcyBPcHRpb25hbCBQcm9kdWN0cyBidXQgYmVmb3JlIHRoZWlyIGVuZHBvaW50cyBoYXZlIGJlZW4gY2FsbGVkKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvZHVjdCBtYXkgYXBwZWFyIGluIGBwcm9kdWN0c2AgYnV0IG5vdCBpbiBgYmlsbGVkX3Byb2R1Y3RzYC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpLiBUaGlzIHdpbGwgY29uc2lzdCBvZiBhbGwgcHJvZHVjdHMgd2hlcmUgYm90aCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOiB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIHRoZSByZXF1aXJlZCBkYXRhIHNjb3BlcyBmb3IgdGhhdCBwcm9kdWN0IGFuZCB5b3UgaGF2ZSBQcm9kdWN0aW9uIGFjY2VzcyBmb3IgdGhhdCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBoYXZlIGNvbnNlbnQgZXhwaXJhdGlvbiBzY2hlZHVsZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuIEN1cnJlbnRseSwgb25seSBpbnN0aXR1dGlvbnMgaW4gRXVyb3BlIGFuZCBhIHNtYWxsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgaW4gdGhlIFVTIGhhdmUgZXhwaXJpbmcgY29uc2VudC4gQ2xvc2VyIHRvIHRoZSAxMDMzIGNvbXBsaWFuY2UgZGVhZGxpbmUgb2YgQXByaWwgMSwgMjAyNiwgZXhwaXJhdGlvbiB0aW1lcyB3aWxsIGJlIHBvcHVsYXRlZCBtb3JlIHdpZGVseS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmcgY29uc2VudCBleHBpcmF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jY29uc2VudC1leHBpcmF0aW9uLWFuZC1yZWF1dGhvcml6YXRpb24uKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZCwgd2hpY2ggY2FuIGJlIHRoZSBjYXNlIGZvciBJdGVtcyB3aXRoIHNvbWUgZm9ybXMgb2YgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbi4gIGBiYWNrZ3JvdW5kYCAtIEl0ZW0gY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgIGB1c2VyX3ByZXNlbnRfcmVxdWlyZWRgIC0gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1VcGRhdGVUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJdGVtVXBkYXRlVHlwZUVudW0ge1xuICAgIEJhY2tncm91bmQgPSAnYmFja2dyb3VuZCcsXG4gICAgVXNlclByZXNlbnRSZXF1aXJlZCA9ICd1c2VyX3ByZXNlbnRfcmVxdWlyZWQnXG59XG5cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbmV3X2FjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEFjdGl2aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWN0aXZpdGllczogQXJyYXk8QWN0aXZpdHk+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aW1lc3RhbXBzIGZvciB0aGUgbGFzdCB0aW1lIGVhY2ggZGF0YSB0eXBlIHdhcyBhY2Nlc3NlZCBwZXIgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PExhc3REYXRhQWNjZXNzVGltZXM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2RhdGFfYWNjZXNzX3RpbWVzOiBBcnJheTxMYXN0RGF0YUFjY2Vzc1RpbWVzPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBhZGRzIGEgUGxhaWQgSXRlbSBkdXJpbmcgYSBMaW5rIHNlc3Npb24gd2hlbiB1c2luZyBIb3N0ZWQgTGluayBvciBNdWx0aS1JdGVtIExpbmsgc2Vzc2lvbnMuIENvbnRhaW5zIHRoZSBwdWJsaWMgdG9rZW4gZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BZGRSZXN1bHRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJVEVNX0FERF9SRVNVTFRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaW5rIHRva2VuIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBpdGVtIHRoYXQgd2FzIGFkZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHRvIGxpc3QgY29ubmVjdGVkIGFwcGxpY2F0aW9ucyBmb3IgYSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+O1xufVxuLyoqXG4gKiBVc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMsIGZvciBjbGllbnRzIG1ha2luZyBhIHJlcXVlc3Qgd2l0aG91dCBhbiBgYWNjZXNzX3Rva2VuYC4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHNlbGVjdCBjbGllbnRzIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4gTW9zdCBjbGllbnRzIHNob3VsZCBjYWxsIC9pdGVtL2ltcG9ydCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZSBoYXNoZWQgYnkgRkkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgZmlfdXNlcm5hbWVfaGFzaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NvcGVzOiBTY29wZXM7XG4gICAgLyoqXG4gICAgICogV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgZHVyaW5nIGVucm9sbG1lbnQsIHRoaXMgZmllbGQgbXVzdCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc3RhdGUgc2VudCB0byB0aGUgcGFydG5lciBpbiB0aGUgT0F1dGggTG9naW4gVVJJLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIHdoZW4gdGhlIGNvbnRleHQgaXMgYEVOUk9MTE1FTlRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzQ29udGV4dH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnRleHQ6IFNjb3Blc0NvbnRleHQ7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGluay9gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG1ldGhvZCB1c2VkIHRvIHBvcHVsYXRlIEF1dGggZGF0YSBmb3IgdGhlIEl0ZW0uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIEl0ZW1zIHRoYXQgaGF2ZSBoYWQgQXV0aCBudW1iZXJzIGRhdGEgc2V0IG9uIGF0IGxlYXN0IG9uZSBvZiBpdHMgYWNjb3VudHMsIGFuZCB3aWxsIGJlIGBudWxsYCBvdGhlcndpc2UuIEZvciBpbmZvIGFib3V0IHRoZSB2YXJpb3VzIGZsb3dzLCBzZWUgb3VyIFtBdXRoIGNvdmVyYWdlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS8pLiAgYElOU1RBTlRfQVVUSGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyXFwncyBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLiAgYElOU1RBTlRfTUFUQ0hgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIEluc3RhbnQgTWF0Y2ggZmFsbGJhY2sgZmxvdy4gIGBBVVRPTUFURURfTUlDUk9ERVBPU0lUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGZsb3cuICBgU0FNRV9EQVlfTUlDUk9ERVBPU0lUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gIGBJTlNUQU5UX01JQ1JPREVQT1NJVFNgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIEluc3RhbnQgTWljcm8tZGVwb3NpdHMgZmxvdy4gIGBEQVRBQkFTRV9NQVRDSGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgRGF0YWJhc2UgTWF0Y2ggZmxvdy4gIGBEQVRBQkFTRV9JTlNJR0hUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgRGF0YWJhc2UgSW5zaWdodHMgZmxvdy4gIGBUUkFOU0ZFUl9NSUdSQVRFRGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSBbYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2Zlci9hY2NvdW50LWxpbmtpbmcvI21pZ3JhdGUtYWNjb3VudC1pbnRvLXRyYW5zZmVycykuICBgSU5WRVNUTUVOVFNfRkFMTEJBQ0tgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIGZvciBJbnZlc3RtZW50cyBNb3ZlIHdhcyBwcm92aWRlZCB2aWEgYSBbZmFsbGJhY2sgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pbnZlc3RtZW50cy1tb3ZlLyNmYWxsYmFjay1mbG93cykuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJdGVtQXV0aE1ldGhvZCB7XG4gICAgSW5zdGFudEF1dGggPSAnSU5TVEFOVF9BVVRIJyxcbiAgICBJbnN0YW50TWF0Y2ggPSAnSU5TVEFOVF9NQVRDSCcsXG4gICAgQXV0b21hdGVkTWljcm9kZXBvc2l0cyA9ICdBVVRPTUFURURfTUlDUk9ERVBPU0lUUycsXG4gICAgU2FtZURheU1pY3JvZGVwb3NpdHMgPSAnU0FNRV9EQVlfTUlDUk9ERVBPU0lUUycsXG4gICAgSW5zdGFudE1pY3JvZGVwb3NpdHMgPSAnSU5TVEFOVF9NSUNST0RFUE9TSVRTJyxcbiAgICBEYXRhYmFzZU1hdGNoID0gJ0RBVEFCQVNFX01BVENIJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzID0gJ0RBVEFCQVNFX0lOU0lHSFRTJyxcbiAgICBUcmFuc2Zlck1pZ3JhdGVkID0gJ1RSQU5TRkVSX01JR1JBVEVEJyxcbiAgICBJbnZlc3RtZW50c0ZhbGxiYWNrID0gJ0lOVkVTVE1FTlRTX0ZBTExCQUNLJ1xufVxuXG4vKipcbiAqIEEgZGF0YSBzY29wZSBmb3IgdGhlIHByb2R1Y3RzIHRoYXQgYSB1c2VyIGNhbiBjb25zZW50IHRvIGluIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1Db25zZW50ZWREYXRhU2NvcGUge1xuICAgIEFjY291bnRBbmRCYWxhbmNlSW5mbyA9ICdhY2NvdW50X2FuZF9iYWxhbmNlX2luZm8nLFxuICAgIENvbnRhY3RJbmZvID0gJ2NvbnRhY3RfaW5mbycsXG4gICAgQWNjb3VudEFuZFJvdXRpbmdOdW1iZXJzID0gJ2FjY291bnRfYW5kX3JvdXRpbmdfbnVtYmVycycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucycsXG4gICAgQ3JlZGl0QW5kTG9hbnMgPSAnY3JlZGl0X2FuZF9sb2FucycsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEJhbmtTdGF0ZW1lbnRzID0gJ2Jhbmtfc3RhdGVtZW50cycsXG4gICAgUmlza0luZm8gPSAncmlza19pbmZvJ1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBlbnRpdHkgYXV0aGVudGljYXRpbmcgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJdGVtQ3JlYXRlQXV0aGVudGljYXRpb24ge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgRGF0YVBhcnRuZXIgPSAnREFUQV9QQVJUTkVSJyxcbiAgICBQbGFpZCA9ICdQTEFJRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdpdGggYW4gSXRlbS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyB1cGRhdGUgbW9kZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJdGVtR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgIGFuZCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1XaXRoQ29uc2VudEZpZWxkc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbVdpdGhDb25zZW50RmllbGRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEl0ZW1TdGF0dXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHByb2R1Y3Qgc3RyaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2F1dGg6IEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gY29uZmlndXJlIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggYW4gSXRlbS4gUGxhaWQgZmlyZXMgYSB3ZWJob29rIGlmIGNyZWRlbnRpYWxzIGZhaWwuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBvZiB1c2VyIElEIGFuZCBhdXRoIHRva2VuIHBhaXIsIHBlcm1pdHRpbmcgUGxhaWQgdG8gYWdncmVnYXRlIGEgdXNlcuKAmXMgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIE9wYXF1ZSB1c2VyIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEF1dGhvcml6YXRpb24gdG9rZW4gUGxhaWQgd2lsbCB1c2UgdG8gYWdncmVnYXRlIHRoaXMgdXNlcuKAmXMgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgYXV0aF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaGFzIGV4aXRlZCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIGdvbmUgdGhyb3VnaCB0aGUgdXBkYXRlIG1vZGUgZmxvdyBpbiB5b3VyIGFwcCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGUgdXBkYXRlIG1vZGUgaW4gYSBkaWZmZXJlbnQgYXBwKS4gSWYgeW91IGhhdmUgbWVzc2FnaW5nIHRoYXQgdGVsbHMgdGhlIHVzZXIgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSBtb2RlIGZsb3csIHlvdSBzaG91bGQgc2lsZW5jZSB0aGlzIG1lc3NhZ2luZyB1cG9uIHJlY2VpdmluZyB0aGUgYExPR0lOX1JFUEFJUkVEYCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMT0dJTl9SRVBBSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIG9uY2UgUGxhaWQgY2FsY3VsYXRlcyBpbmNvbWUgZnJvbSBhbiBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYHB1YmxpY190b2tlbmAgZm9yIHRoZSBwYXJ0aWN1bGFyIEl0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIGBwdWJsaWNfdG9rZW5gLCBvYnRhaW5lZCBmcm9tIHRoZSBMaW5rIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9yIGAvc2FuZGJveC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIGZhaWxzIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB3ZWJob29rIGZpcmVkIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgd2ViaG9vayB3YXMgZmlyZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIHNlbnRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHdlYmhvb2sgY29kZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIGNvZGVfc2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTGFzdFdlYmhvb2t9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBzdWNjZXNzZnVsbHkgY29ubmVjdHMgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgbGFzdF9zdWNjZXNzZnVsX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLiBUaGlzIGZpZWxkIGRvZXMgbm90IHJlZmxlY3QgdHJhbnNhY3Rpb25zIHVwZGF0ZXMgcGVyZm9ybWVkIGJ5IG5vbi1UcmFuc2FjdGlvbnMgcHJvZHVjdHMgKGUuZy4gU2lnbmFsKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgbGFzdF9mYWlsZWRfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgSXRlbS4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGFuIEl0ZW0sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUF1dGhNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGF1dGhfbWV0aG9kPzogSXRlbUF1dGhNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZC4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYmlsbGVkX3Byb2R1Y3RzYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXZhaWxhYmxlX3Byb2R1Y3RzYC4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gQWxzbyBub3RlIHRoYXQgcHJvZHVjdHMgdGhhdCBhcmUgYmlsbGVkIG9uIGEgcGF5LXBlci1jYWxsIGJhc2lzIHJhdGhlciB0aGFuIGEgcGF5LXBlci1JdGVtIGJhc2lzLCBzdWNoIGFzIGBiYWxhbmNlYCwgd2lsbCBub3QgYXBwZWFyIGhlcmUuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGJpbGxlZF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhZGRlZCB0byB0aGUgSXRlbS4gSW4gYWxtb3N0IGFsbCBjYXNlcywgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBgYmlsbGVkX3Byb2R1Y3RzYCBmaWVsZC4gRm9yIHNvbWUgcHJvZHVjdHMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhbiBJdGVtIGJ1dCBub3QgeWV0IGJpbGxlZCAoZS5nLiBBc3NldHMsIGJlZm9yZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGhhcyBiZWVuIGNhbGxlZCwgb3IgQXV0aCBvciBJZGVudGl0eSB3aGVuIGFkZGVkIGFzIE9wdGlvbmFsIFByb2R1Y3RzIGJ1dCBiZWZvcmUgdGhlaXIgZW5kcG9pbnRzIGhhdmUgYmVlbiBjYWxsZWQpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9kdWN0IG1heSBhcHBlYXIgaW4gYHByb2R1Y3RzYCBidXQgbm90IGluIGBiaWxsZWRfcHJvZHVjdHNgLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhpcyB3aWxsIGNvbnNpc3Qgb2YgYWxsIHByb2R1Y3RzIHdoZXJlIGJvdGggb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZTogdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byB0aGUgcmVxdWlyZWQgZGF0YSBzY29wZXMgZm9yIHRoYXQgcHJvZHVjdCBhbmQgeW91IGhhdmUgUHJvZHVjdGlvbiBhY2Nlc3MgZm9yIHRoYXQgcHJvZHVjdC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBoYXZlIGNvbnNlbnQgZXhwaXJhdGlvbiBzY2hlZHVsZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuIEN1cnJlbnRseSwgb25seSBpbnN0aXR1dGlvbnMgaW4gRXVyb3BlIGFuZCBhIHNtYWxsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgaW4gdGhlIFVTIGhhdmUgZXhwaXJpbmcgY29uc2VudC4gQ2xvc2VyIHRvIHRoZSAxMDMzIGNvbXBsaWFuY2UgZGVhZGxpbmUgb2YgQXByaWwgMSwgMjAyNiwgZXhwaXJhdGlvbiB0aW1lcyB3aWxsIGJlIHBvcHVsYXRlZCBtb3JlIHdpZGVseS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmcgY29uc2VudCBleHBpcmF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jY29uc2VudC1leHBpcmF0aW9uLWFuZC1yZWF1dGhvcml6YXRpb24uKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdGhlIGNhc2UgZm9yIEl0ZW1zIHdpdGggc29tZSBmb3JtcyBvZiB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uLiAgYGJhY2tncm91bmRgIC0gSXRlbSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCAgYHVzZXJfcHJlc2VudF9yZXF1aXJlZGAgLSBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIHVwZGF0ZV90eXBlOiBJdGVtV2l0aENvbnNlbnRGaWVsZHNVcGRhdGVUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBJdGVtIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlIGNhc2VzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuICAgWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgb3IgdXBkYXRlIHRoZSBsaXN0IG9mIHVzZSBjYXNlcyB0byByZXF1ZXN0IGF0IGFueSB0aW1lIHZpYSB0aGUgTGluayBDdXN0b21pemF0aW9uIHNlY3Rpb24gb2YgdGhlIFtQbGFpZCBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LXY1KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX3VzZV9jYXNlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGRhdGEgc2NvcGVzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgYGNvbnNlbnRlZF9wcm9kdWN0c2A7IHNlZSB0aGUgW2Z1bGwgbWFwcGluZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLyNkYXRhLXNjb3Blcy1ieS1wcm9kdWN0KSBvZiBkYXRhIHNjb3BlcyBhbmQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PEl0ZW1Db25zZW50ZWREYXRhU2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfZGF0YV9zY29wZXM/OiBBcnJheTxJdGVtQ29uc2VudGVkRGF0YVNjb3BlPjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJdGVtV2l0aENvbnNlbnRGaWVsZHNVcGRhdGVUeXBlRW51bSB7XG4gICAgQmFja2dyb3VuZCA9ICdiYWNrZ3JvdW5kJyxcbiAgICBVc2VyUHJlc2VudFJlcXVpcmVkID0gJ3VzZXJfcHJlc2VudF9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgSXRlbSB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlIGNhc2VzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuICAgWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgb3IgdXBkYXRlIHRoZSBsaXN0IG9mIHVzZSBjYXNlcyB0byByZXF1ZXN0IGF0IGFueSB0aW1lIHZpYSB0aGUgTGluayBDdXN0b21pemF0aW9uIHNlY3Rpb24gb2YgdGhlIFtQbGFpZCBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LXY1KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2ZcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBgY29uc2VudGVkX3Byb2R1Y3RzYDsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT47XG59XG4vKipcbiAqIEEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbSldUIGxpYnJhcmllc10oaHR0cHM6Ly9qd3QuaW8vI2xpYnJhcmllcy1pbykgdG8gdmVyaWZ5IFBsYWlkIHdlYmhvb2tzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXS1B1YmxpY0tleVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpXS1B1YmxpY0tleSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFsZyBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcnYgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgY3VydmUgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3J2OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtpZCAoS2V5IElEKSBtZW1iZXIgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gY2hvb3NlIGFtb25nIGEgc2V0IG9mIGtleXMgd2l0aGluIHRoZSBKV0sgZHVyaW5nIGtleSByb2xsb3Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBraWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga3R5IChrZXkgdHlwZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleSwgc3VjaCBhcyBSU0Egb3IgRUMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga3R5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZSAocHVibGljIGtleSB1c2UpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgdXNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHggbWVtYmVyIGNvbnRhaW5zIHRoZSB4IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldUSGVhZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGtpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICB0eXBlOiBBZGRyZXNzUHVycG9zZUxhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgc3RyZWV0PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIGNpdHk/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgcmVnaW9uPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2RldGFpbHM/OiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGRhdGVfb2ZfYmlydGhgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgZGF5PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBtb250aD86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgeWVhcj86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMua3ljX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGt5Y19jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5reWNfY2hlY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0FkZHJlc3NTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja05hbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBLWUNDaGVja05hbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja1Bob25lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBLWUNDaGVja1Bob25lU3VtbWFyeTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgYWRkcmVzc2AgZmllbGQgbWF0Y2hlZCBmb3IgZmllbGRzIHRoYXQgYXJlIG9ubHkgcHJlc2VudCBvbiBhbiBpbnRlcm5hdGlvbmFsIEtZQyBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgYnVpbGRpbmc6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnR5OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGRpc3RyaWN0OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGhvdXNlX251bWJlcjogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdWJwcmVtaXNlOiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIHRob3JvdWdoZmFyZTogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgaWRfbnVtYmVyYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBuYW1lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja05hbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja05hbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYHBob25lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tQaG9uZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIGFyZWFfY29kZTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhdHlwZSB3YXMgYWNjZXNzZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXN0RGF0YUFjY2Vzc1RpbWVzIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXBwbGljYXRpb24gYWNjZXNzaW5nIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBhY2NvdW50X2JhbGFuY2VfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X2JhbGFuY2VfaW5mbzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfcm91dGluZ19udW1iZXIgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYWNjb3VudF9yb3V0aW5nX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGNvbnRhY3RfZGV0YWlscyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjb250YWN0X2RldGFpbHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbnMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY3JlZGl0X2FuZF9sb2FucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfYW5kX2xvYW5zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgaW52ZXN0bWVudHMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBwYXlyb2xsX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb25fcmlza19pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3Jpc2tfaW5mbzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgTElBQklMSVRJRVNgIGFuZCBjb2RlIGBERUZBVUxUX1VQREFURWAgd2lsbCBiZSBmaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGxpYWJpbGl0aWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhIGxpYWJpbGl0aWVzIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElBQklMSVRJRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBsaWFiaWxpdGllcy5cXCdcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfbmV3X2xpYWJpbGl0aWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBsaWFiaWxpdGllcyBmaWVsZHMgdGhhdCBjaGFuZ2VkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcInBhc3RfYW1vdW50X2R1ZVxcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfbGlhYmlsaXRpZXM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9saWFiaWxpdGllcy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBgb3B0aW9uc2AgY2Fubm90IGJlIG51bGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGxpYWJpbGl0eSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlZGl0IGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRDYXJkTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBjcmVkaXQ6IEFycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9ydGdhZ2UgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PE1vcnRnYWdlTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBtb3J0Z2FnZTogQXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3R1ZGVudCBsb2FuIGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTdHVkZW50TG9hbj59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgc3R1ZGVudDogQXJyYXk8U3R1ZGVudExvYW4+IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBsaWFiaWxpdHkgb2JqZWN0LCBlaXRoZXIgYGNyZWRpdGAgb3IgYHN0dWRlbnRgLiBNb3J0Z2FnZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIHRoZSBjdXN0b20gU2FuZGJveC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyY2hhc2UgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIEZvciBzaW1wbGljaXR5LCB0aGlzIGlzIHRoZSBvbmx5IGludGVyZXN0IHJhdGUgdXNlZCB0byBjYWxjdWxhdGUgaW50ZXJlc3QgY2hhcmdlcy4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHB1cmNoYXNlX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjYXNoIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY2FzaF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFsYW5jZSB0cmFuc2ZlciBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGJhbGFuY2VfdHJhbnNmZXJfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpYWwgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzcGVjaWFsX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbGFzdF9wYXltZW50X2Ftb3VudGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBtaW5pbXVtX3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YCBvciBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19vdmVyZHVlYCBmaWVsZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgbG9hbiBwcmluY2lwYWwuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5vbWluYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnRlcmVzdCBjYXBpdGFsaXphdGlvbiBiZWdpbnMgYXQgdGhlIGdpdmVuIG51bWJlciBvZiBtb250aHMgYWZ0ZXIgbG9hbiBvcmlnaW5hdGlvbi4gQnkgZGVmYXVsdCBpbnRlcmVzdCBpcyBuZXZlciBjYXBpdGFsaXplZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9jYXBpdGFsaXphdGlvbl9ncmFjZV9wZXJpb2RfbW9udGhzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuUmVwYXltZW50TW9kZWx9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X21vZGVsOiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgZXhwZWN0ZWRfcGF5b2ZmX2RhdGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBndWFyYW50b3JgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgaXNfZmVkZXJhbGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX2ZlZGVyYWw6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsb2FuX25hbWVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBwYXltZW50X3JlZmVyZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBheW1lbnRfcmVmZXJlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi5kZXNjcmlwdGlvbmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLnR5cGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC4gUG9zc2libGUgdmFsdWVzIGFyZTogYFxcXCJleHRlbmRlZCBncmFkdWF0ZWRcXFwiYCwgYFxcXCJleHRlbmRlZCBzdGFuZGFyZFxcXCJgLCBgXFxcImdyYWR1YXRlZFxcXCJgLCBgXFxcImluY29tZS1jb250aW5nZW50IHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1iYXNlZCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudFxcXCJgLCBgXFxcImludGVyZXN0IG9ubHlcXFwiYCwgYFxcXCJvdGhlclxcXCJgLCBgXFxcInBheSBhcyB5b3UgZWFyblxcXCJgLCBgXFxcInJldmlzZWQgcGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwic3RhbmRhcmRcXFwiYCwgb3IgYFxcXCJzYXZpbmcgb24gYSB2YWx1YWJsZSBlZHVjYXRpb25cXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHNlcXVlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2VxdWVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogQWRkcmVzcztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGV9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgY2FsbGJhY2tfdHlwZT86IExpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtFdmVudE5hbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgZXZlbnRfbmFtZT86IExpbmtFdmVudE5hbWU7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXJlIGluIHRoZSBmbG93IHRoZSBMaW5rIHVzZXIgZXhpdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB1c2VyXFwncyBhY3Rpb25zIGFuZCBldmVudHMgdGhyb3VnaCB0aGUgTGluayBmbG93LiBJbmNsdWRlIHRoaXMgaWRlbnRpZmllciB3aGVuIG9wZW5pbmcgYSBzdXBwb3J0IHRpY2tldCBmb3IgZmFzdGVyIHR1cm5hcm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgSUQgZm9yIHRoZSBsYXN0IHJlcXVlc3QgbWFkZSBieSBMaW5rLiBUaGlzIGNhbiBiZSBzaGFyZWQgd2l0aCBQbGFpZCBTdXBwb3J0IHRvIGV4cGVkaXRlIGludmVzdGlnYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtEZWxpdmVyeUluc3RpdHV0aW9uO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBhY2NvdW50cyB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua0RlbGl2ZXJ5QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxMaW5rRGVsaXZlcnlBY2NvdW50Pjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byBhY2NvdW50IGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgYWNjb3VudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cy4gSXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gaXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgY2xhc3NfdHlwZT86IHN0cmluZztcbn1cbi8qKlxuICogV2ViaG9vayBjb250YWluaW5nIG1ldGFkYXRhIHByb3hpZWQgb3ZlciBmcm9tIExpbmsgY2FsbGJhY2sgZS5nIGBvbkV2ZW50YCwgYG9uRXhpdGAsIGBvblN1Y2Nlc3NgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSU5LX0RFTElWRVJZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMSU5LX0NBTExCQUNLYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rQ2FsbGJhY2tNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgbGlua19jYWxsYmFja19tZXRhZGF0YTogTGlua0NhbGxiYWNrTWV0YWRhdGE7XG59XG4vKipcbiAqIFRoZSBjb21tdW5pY2F0aW9uIG1ldGhvZCBjb250YWluaW5nIGJvdGggdGhlIHR5cGUgYW5kIGFkZHJlc3MgdG8gc2VuZCB0aGUgVVJMLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gICAgICovXG4gICAgbWV0aG9kPzogTGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2Q7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciAvIGVtYWlsIGFkZHJlc3MgdGhhdCBIb3N0ZWQgTGluayBzZXNzaW9ucyBhcmUgZGVsaXZlcmVkIHRvLiBQaG9uZSBudW1iZXJzIG11c3QgYmUgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeU9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogTGlua0RlbGl2ZXJ5T3B0aW9ucztcbn1cbi8qKlxuICogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLCB3aGljaCB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgc3BlY2lmaWVkIGRlbGl2ZXJ5IG1ldGhvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi4gU2FtZSBhcyB0aGUgYGxpbmtfdG9rZW5gIHN0cmluZyBleGNsdWRpbmcgdGhlIFxcXCJsaW5rLXtlbnZ9LVxcXCIgcHJlZml4LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGVsaXZlcnkgbWV0aG9kIHRvIGJlIHVzZWQgdG8gZGVsaXZlciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiBVUkwuICBgU01TYDogVGhlIFVSTCB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoIFNNUyAgYEVNQUlMYDogVGhlIFVSTCB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoIGVtYWlsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ1NNUycsXG4gICAgRW1haWwgPSAnRU1BSUwnXG59XG5cbi8qKlxuICogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uIHdhcyBjcmVhdGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNvbXBsZXRlZCBhdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGluc3RpdHV0aW9uIG5hbWUsIHN1Y2ggYXMgXFwnV2VsbHMgRmFyZ29cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSByZWxhdGVkIHRvIHRoZSBkZWxpdmVyeSBvZiB0aGUgbGluayBzZXNzaW9uIHRvIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZD86IExpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gICAgICovXG4gICAgZGVsaXZlcnlfc3RhdHVzPzogTGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzO1xufVxuLyoqXG4gKiBPcHRpb25hbCBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeU9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5UmVjaXBpZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlPcHRpb25zXG4gICAgICovXG4gICAgcmVjaXBpZW50PzogTGlua0RlbGl2ZXJ5UmVjaXBpZW50O1xufVxuLyoqXG4gKiBNZXRhZGF0YSByZWxhdGVkIHRvIHRoZSByZWNpcGllbnQuIElmIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBwb3B1bGF0ZSB0aGlzIGZpZWxkIGlzIG5vdCBhdmFpbGFibGUsIGxlYXZlIGl0IGJsYW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW11bmljYXRpb24gbWV0aG9kcyB0byBzZW5kIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTCB0by4gSWYgZGVsaXZlcnkgaXMgbm90IHJlcXVpcmVkLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5UmVjaXBpZW50XG4gICAgICovXG4gICAgY29tbXVuaWNhdGlvbl9tZXRob2RzPzogQXJyYXk8TGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZD47XG4gICAgLyoqXG4gICAgICogRmlyc3QgbmFtZSBvZiB0aGUgcmVjaXBpZW50LiBXaWxsIGJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsIC8gdGV4dCAoaWYgY29uZmlndXJlZCkuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uLiAgYENSRUFURURgOiBUaGUgc2Vzc2lvbiBpcyBjcmVhdGVkIGJ1dCBub3QgeWV0IGFjY2Vzc2VkIGJ5IHRoZSB1c2VyICBgT1BFTkVEYDogVGhlIHNlc3Npb24gaXMgb3BlbmVkIGJ5IHRoZSB1c2VyIGJ1dCBub3QgeWV0IGNvbXBsZXRlZCAgYEVYSVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGV4aXRlZCBieSB0aGUgdXNlciAgYENPTVBMRVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgdXNlciAgYEVYUElSRURgOiBUaGUgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cyB7XG4gICAgQ3JlYXRlZCA9ICdDUkVBVEVEJyxcbiAgICBPcGVuZWQgPSAnT1BFTkVEJyxcbiAgICBFeGl0ZWQgPSAnRVhJVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnQ09NUExFVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1BlbmRpbmcgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGVuZGluZydcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBMaW5rIGNhbGxiYWNrIGV2ZW50XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlIHtcbiAgICBTdWNjZXNzID0gJ09OX1NVQ0NFU1MnLFxuICAgIEV2ZW50ID0gJ09OX0VWRU5UJyxcbiAgICBFeGl0ID0gJ09OX0VYSVQnXG59XG5cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIHVzZWQgdG8gZGVsaXZlciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Qge1xuICAgIFNtcyA9ICdTTVMnLFxuICAgIEVtYWlsID0gJ0VNQUlMJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBIb3N0ZWQgTGluayB0byB0aGUgdXNlclxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBBbiBldmVudCB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB1c2VyIHdhcyBnb2luZyB0aHJvdWdoIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0V2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50IHtcbiAgICAvKipcbiAgICAgKiBFdmVudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgZXZlbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVVJRCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZHVwbGljYXRlIGV2ZW50c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtFdmVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9tZXRhZGF0YTogTGlua0V2ZW50TWV0YWRhdGE7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IGFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgdHlwZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMga2V5IGluZGljYXRlcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIEVtaXR0ZWQgYnk6IGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGV4aXRfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB1c2VkIHRvIHNlYXJjaCBmb3IgaW5zdGl0dXRpb25zLiBFbWl0dGVkIGJ5OiBgU0VBUkNIX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlYXJjaF9xdWVyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdXNlciBoYXMgZW5jb3VudGVyZWQgb25lIG9mIHRoZSBmb2xsb3dpbmcgTUZBIHR5cGVzOiBjb2RlLCBkZXZpY2UsIHF1ZXN0aW9ucywgc2VsZWN0aW9ucy4gRW1pdHRlZCBieTogYFNVQk1JVF9NRkFgIGFuZCBgVFJBTlNJVElPTl9WSUVXYCB3aGVuIGB2aWV3X25hbWVgIGlzIGBNRkFgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbWZhX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHZpZXcgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8uIEVtaXR0ZWQgYnk6IGBUUkFOU0lUSU9OX1ZJRVdgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdmlld19uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciB0aGUgdmVyaWZpY2F0aW9uIG1ldGhvZCBmb3IgYSBtYXRjaGVkIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBBdXRoIFR5cGUgU2VsZWN0IGZsb3cgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgc2VsZWN0ZWQgdmVyaWZpY2F0aW9uIG1ldGhvZCwgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBwaG9uZW90cGAgb3IgYHBhc3N3b3JkYDsgIGlmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZWxlY3RlZCBBdXRoIFR5cGUgU2VsZWN0IGZsb3csIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgZmxvd190eXBlX21hbnVhbGAgb3IgYGZsb3dfdHlwZV9pbnN0YW50YC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX1ZFUklGWV9NRVRIT0RgIGFuZCBgU0VMRUNUX0FVVEhfVFlQRWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYnJhbmRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoaXMgaW5zdGl0dXRpb24gd2FzIG1hdGNoZWQuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYHJldHVybmluZ191c2VyYCBvciBgcm91dGluZ19udW1iZXJgIGlmIGVtaXR0ZWQgYnkgYE1BVENIRURfU0VMRUNUX0lOU1RJVFVUSU9OYC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgYmUgYFNBVkVEX0lOU1RJVFVUSU9OYCBvciBgQVVUT19TRUxFQ1RfU0FWRURfSU5TVElUVVRJT05gIGlmIGVtaXR0ZWQgYnkgYFNFTEVDVF9JTlNUSVRVVElPTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXRjaF9yZWFzb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIHN1Ym1pdHRlZCBieSB1c2VyIGF0IHRoZSBtaWNyby1kZXBvc2l0cyByb3V0aW5nIG51bWJlciBwYW5lLiBFbWl0dGVkIGJ5IGBTVUJNSVRfUk9VVElOR19OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG1hc2sgZXh0cmFjdGVkIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgYWNjb3VudCBudW1iZXIuIElmIHRoZSB1c2VyLWlucHV0dGVkIGFjY291bnQgbnVtYmVyIGlzIGZvdXIgZGlnaXRzIGxvbmcsIGBhY2NvdW50X251bWJlcl9tYXNrYCBpcyBlbXB0eS4gRW1pdHRlZCBieSBgU1VCTUlUX0FDQ09VTlRfTlVNQkVSYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyX21hc2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdGhhdCBoYXMganVzdCBvY2N1cnJlZCBpbiB0aGUgTGluayBmbG93LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0V2ZW50TmFtZSB7XG4gICAgQmFua0luY29tZUluc2lnaHRzQ29tcGxldGVkID0gJ0JBTktfSU5DT01FX0lOU0lHSFRTX0NPTVBMRVRFRCcsXG4gICAgQ2xvc2VPYXV0aCA9ICdDTE9TRV9PQVVUSCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIEV4aXQgPSAnRVhJVCcsXG4gICAgRmFpbE9hdXRoID0gJ0ZBSUxfT0FVVEgnLFxuICAgIEhhbmRvZmYgPSAnSEFORE9GRicsXG4gICAgSXNzdWVGb2xsb3dlZCA9ICdJU1NVRV9GT0xMT1dFRCcsXG4gICAgT3BlbiA9ICdPUEVOJyxcbiAgICBPcGVuTXlQbGFpZCA9ICdPUEVOX01ZX1BMQUlEJyxcbiAgICBPcGVuT2F1dGggPSAnT1BFTl9PQVVUSCcsXG4gICAgU2VhcmNoSW5zdGl0dXRpb24gPSAnU0VBUkNIX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RBdXRoVHlwZSA9ICdTRUxFQ1RfQVVUSF9UWVBFJyxcbiAgICBTZWxlY3RCcmFuZCA9ICdTRUxFQ1RfQlJBTkQnLFxuICAgIFNlbGVjdERlZ3JhZGVkSW5zdGl0dXRpb24gPSAnU0VMRUNUX0RFR1JBREVEX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3REb3duSW5zdGl0dXRpb24gPSAnU0VMRUNUX0RPV05fSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEZpbHRlcmVkSW5zdGl0dXRpb24gPSAnU0VMRUNUX0ZJTFRFUkVEX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfSU5TVElUVVRJT04nLFxuICAgIFN1Ym1pdEFjY291bnROdW1iZXIgPSAnU1VCTUlUX0FDQ09VTlRfTlVNQkVSJyxcbiAgICBTdWJtaXRDcmVkZW50aWFscyA9ICdTVUJNSVRfQ1JFREVOVElBTFMnLFxuICAgIFN1Ym1pdERvY3VtZW50cyA9ICdTVUJNSVRfRE9DVU1FTlRTJyxcbiAgICBTdWJtaXREb2N1bWVudHNFcnJvciA9ICdTVUJNSVRfRE9DVU1FTlRTX0VSUk9SJyxcbiAgICBTdWJtaXREb2N1bWVudHNTdWNjZXNzID0gJ1NVQk1JVF9ET0NVTUVOVFNfU1VDQ0VTUycsXG4gICAgU3VibWl0TWZhID0gJ1NVQk1JVF9NRkEnLFxuICAgIFN1Ym1pdFJvdXRpbmdOdW1iZXIgPSAnU1VCTUlUX1JPVVRJTkdfTlVNQkVSJyxcbiAgICBUcmFuc2l0aW9uVmlldyA9ICdUUkFOU0lUSU9OX1ZJRVcnLFxuICAgIFZpZXdEYXRhVHlwZXMgPSAnVklFV19EQVRBX1RZUEVTJ1xufVxuXG4vKipcbiAqIFRoaXMgd2ViaG9vayBjb250YWlucyBhIHN1bW1hcnkgb2YgdGhlIGV2ZW50cyBmcm9tIGEgTGluayBzZXNzaW9uIGFuZCB3aWxsIGJlIGZpcmVkIGFmdGVyIHRoZSB1c2VyIGZpbmlzaGVzIGdvaW5nIHRocm91Z2ggTGluay4gSWYgdGhlIHVzZXIgYWJhbmRvbnMgdGhlIExpbmsgZmxvdyAoaS5lLiwgY2xvc2VzIHRoZSBob3N0ZWQgbGluayB3ZWJwYWdlIG9yIGxlYXZlcyBMaW5rIG9wZW4gZm9yIHRvbyBsb25nIHdpdGhvdXQgdGFraW5nIGFueSBhY3Rpb24pLCB0aGUgd2ViaG9vayB3aWxsIGJlIGZpcmVkIDUtMTUgbWludXRlcyBhZnRlciB0aGUgbGFzdCB1c2VyIGludGVyYWN0aW9uLiBBIHNpbmdsZSBMaW5rIHNlc3Npb24gbWF5IG9jY2FzaW9uYWxseSBnZW5lcmF0ZSBtdWx0aXBsZSBgRVZFTlRTYCB3ZWJob29rcy4gSWYgdGhpcyBvY2N1cnMsIHRoZSBuZXcgd2ViaG9vayB3aWxsIGNvbnRhaW4gYWxsIHByZXZpb3VzIGV2ZW50cyBmb3IgdGhlIHNlc3Npb24sIGFzIHdlbGwgYXMgbmV3IGV2ZW50cyB0aGF0IG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBgRVZFTlRTYCB3ZWJob29rIHdhcyBzZW50LiBJZiB0aGlzIG9jY3VycywgZXZlbnRzIGNhbiBiZSBncm91cGVkIHVzaW5nIHRoZSBgbGlua19zZXNzaW9uX2lkYCBmaWVsZCBhbmQsIGlmIG5lY2Vzc2FyeSwgZGUtZHVwbGljYXRlZCB1c2luZyB0aGUgYGV2ZW50X2lkYCBmaWVsZC4gIEJ5IGRlZmF1bHQsIHRoZSBgRVZFTlRTYCB3ZWJob29rIGlzIHNlbnQgb25seSBmb3Igc2Vzc2lvbnMgd2hlcmUgdGhlIGVuZCB1c2VyIGdvZXMgdGhyb3VnaCBhIEhvc3RlZCBMaW5rIGZsb3cgKGluY2x1ZGluZyBMaW5rIFJlY292ZXJ5IGZsb3dzKS4gSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIHNlc3Npb25zIG5vdCB1c2luZyBIb3N0ZWQgTGluaywgY29udGFjdCB5b3VyIEFjY291bnQgTWFuYWdlciBvciBTdXBwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudHNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFVkVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGluayBldmVudHMgZW1pdHRlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50czogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgYXJlIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfY29ycmVsYXRpb25faWRgIGZyb20gYSByZWNlaXZlZCBPQXV0aCByZWRpcmVjdCBVUkkgY2FsbGJhY2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jb3JyZWxhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBsaW5rX3Rva2VuYCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBgbGlua19jb3JyZWxhdGlvbl9pZGAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlLWluaXRpYWxpemUgTGluay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbiBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1czogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1czogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkb2N1bWVudCB1cGxvYWQgQ1JBIHNlc3Npb24gaW4gbGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBQbGFpZCBDaGVjayBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBDaGVjayBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gVGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uRXhpdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25leGl0KSBjYWxsYmFjayBmcm9tIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uRXhpdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25leGl0KSBjYWxsYmFjayBmcm9tIExpbmsuIFRoaXMgZmllbGQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbYGV4aXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWdldC1yZXNwb25zZS1saW5rLXNlc3Npb25zLWV4aXQpLCBmb3IgaW1wcm92ZWQgbmFtaW5nIGNvbnNpc3RlbmN5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIGlmIGEgdXNlciBleGl0cyBMaW5rIHdpdGhvdXQgc3VjY2Vzc2Z1bGx5IGxpbmtpbmcgYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG9yIEluc3RhbnQgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgV2VsbHMgRmFyZ29gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24sIGFsb25nIHdpdGggdGhlIHB1YmxpYyB0b2tlbihzKSBpZiBhdmFpbGFibGUuICBCeSBkZWZhdWx0LCB0aGlzIHdlYmhvb2sgaXMgc2VudCBvbmx5IGZvciBzZXNzaW9ucyBlbmFibGVkIGZvciB0aGUgSG9zdGVkIExpbmsgZmxvdyAoaW5jbHVkaW5nIExpbmsgUmVjb3ZlcnkgZmxvd3MpIG9yIGEgTXVsdGktSXRlbSBMaW5rIGZsb3cuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBvdGhlciBzZXNzaW9ucywgY29udGFjdCB5b3VyIEFjY291bnQgTWFuYWdlciBvciBTdXBwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTRVNTSU9OX0ZJTklTSEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFsIHN0YXR1cyBvZiB0aGUgTGluayBzZXNzaW9uLiBXaWxsIGFsd2F5cyBiZSBcXFwiU1VDQ0VTU1xcXCIgb3IgXFxcIkVYSVRFRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaW5rIHRva2VuIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbiBnZW5lcmF0ZWQgYnkgdGhlIExpbmsgc2Vzc2lvbi4gVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkOyBwbGVhc2UgdXNlIGBwdWJsaWNfdG9rZW5zYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbnMgZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFJldHVybmVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBXLTJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGl0ZW1fYWRkX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBQbGFpZCBDaGVjayBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGNyYV9pdGVtX2FkZF9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVzdWx0czogQXJyYXk8TGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgZG9jdW1lbnRfaW5jb21lX3Jlc3VsdHM6IENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGNyYV9kb2N1bWVudF91cGxvYWRfcmVzdWx0cz86IExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHQgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvblN1Y2Nlc3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uc3VjY2VzcykgY2FsbGJhY2sgZnJvbSBMaW5rLiBUaGlzIG9iamVjdCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBuZXdlciBbYHJlc3VsdHMuaXRlbV9hZGRfcmVzdWx0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1nZXQtcmVzcG9uc2UtbGluay1zZXNzaW9ucy1yZXN1bHRzLWl0ZW0tYWRkLXJlc3VsdHMpLCB3aGljaCBjYW4gc3VwcG9ydCBtdWx0aXBsZSBwdWJsaWMgdG9rZW5zIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5ZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc1xuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIERpc3BsYXllZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBgYWNjb3VudHNgIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9zdGF0dXM/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgYWNjb3VudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBJdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiAgYGRhdGFiYXNlX2luc2lnaHRzX3BlbmRpbmdgOiBUaGUgRGF0YWJhc2UgSW5zaWdodHMgcmVzdWx0IGlzIHBlbmRpbmcgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHVwb24gQXV0aCByZXF1ZXN0LiBOb3RlOiBEYXRhYmFzZSBJbnNpZ2h0cyBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgYG51bGxgOiBOZWl0aGVyIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG5vciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gYXJlIGJlaW5nIHVzZWQgZm9yIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiB3YXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHRoZSB1c2VyXFwncyBzZWxlY3Rpb24gd2hlbiBhc2tlZCBpZiB0aGUgYWNjb3VudCBiZWluZyB2ZXJpZmllZCBpcyBhIGBidXNpbmVzc2Agb3IgYHBlcnNvbmFsYCBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgYXMgUGxhaWQgbm8gbG9uZ2VyIGNvbGxlY3RzIHRoaXMgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBtaWNyby1kZXBvc2l0IGZsb3cuIFRvIHNlZSB3aGV0aGVyIGFuIGFjY291bnQgaXMgYnVzaW5lc3Mgb3IgcGVyc29uYWwsIHVzZSB0aGUgYGhvbGRlcl9jYXRlZ29yeWAgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNsYXNzX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbnN0aXR1dGlvbiBvYmplY3QuIElmIHRoZSBJdGVtIHdhcyBjcmVhdGVkIHZpYSBTYW1lLURheSBvciBJbnN0YW50IG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCB3aWxsIGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGluc3RpdHV0aW9uIG5hbWUsIHN1Y2ggYXMgYFxcJ1dlbGxzIEZhcmdvXFwnYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBpbnN0aXR1dGlvbiBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGEgdHJhbnNmZXIuIFJldHVybmVkIG9ubHkgd2hlbiBbVHJhbnNmZXIgVUldKC9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpKSBpcyBpbXBsZW1lbnRlZC4gIC0gYENPTVBMRVRFYCDigJMgVGhlIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQuIC0gYElOQ09NUExFVEVgIOKAkyBUaGUgdHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gRm9yIGhlbHAsIHNlZSBbVHJvdWJsZXNob290aW5nIHRyYW5zZmVyc10oL2RvY3MvdHJhbnNmZXIvdXNpbmctdHJhbnNmZXItdWkjdHJvdWJsZXNob290aW5nLXRyYW5zZmVycykuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzIHtcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURScsXG4gICAgSW5jb21wbGV0ZSA9ICdJTkNPTVBMRVRFJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgTGluayB3aWxsIHByb3ZpZGUgbGltaXRlZCBhY2NvdW50IGZpbHRlcmluZzogaXQgd2lsbCBvbmx5IGRpc3BsYXkgSW5zdGl0dXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJvZHVjdHMgc3VwcGxpZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQsIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIHdpbGwgYWxzbyBmaWx0ZXIgb3V0IGFjY291bnRzIG90aGVyIHRoYW4gYGNoZWNraW5nYCwgYHNhdmluZ3NgLCBhbmQgYGNhc2ggbWFuYWdlbWVudGAgYWNjb3VudHMgb24gdGhlIEFjY291bnQgU2VsZWN0IHBhbmUuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIFRoZSBmaWx0ZXIgbWF5IG9yIG1heSBub3QgaW1wYWN0IHRoZSBsaXN0IG9mIGFjY291bnRzIHNob3duIGJ5IHRoZSBpbnN0aXR1dGlvbiBpbiB0aGUgT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyBpbnN0aXR1dGlvbi4gSWYgdGhlIHVzZXIgc2VsZWN0cyBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzIGluIHRoZSBPQXV0aCBmbG93LCB0aGVzZSBhY2NvdW50cyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgSXRlbS4gSWYgdGhlIHVzZXIgc2VsZWN0cyBvbmx5IGV4Y2x1ZGVkIGFjY291bnQgc3VidHlwZXMsIHRoZSBsaW5rIGF0dGVtcHQgd2lsbCBmYWlsIGFuZCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHRyeSBhZ2Fpbi4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQWNjb3VudEZpbHRlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBJbnZlc3RtZW50RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdGhlckZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBvdGhlcj86IE90aGVyRmlsdGVyO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBDYXNoZmxvdyBSZXBvcnQgcHJvZHVjdC4gQ3VycmVudGx5IGluIGNsb3NlZCBiZXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNhc2hmbG93UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgaW4gdGhlIENhc2hmbG93IFJlcG9ydCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdG8gcGFzcyBpbiBmb3IgdGhlIENhcmQgU3dpdGNoIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQklOIChCYW5rIElkZW50aWZpY2F0aW9uIE51bWJlcikgb2YgdGhlIGNhcmQgdG8gc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAgICAgKi9cbiAgICBjYXJkX2Jpbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgSG9zdGVkIExpbmsuIFRvIGVuYWJsZSB0aGUgc2Vzc2lvbiBmb3IgSG9zdGVkIExpbmssIHNlbmQgdGhpcyBvYmplY3QgaW4gdGhlIHJlcXVlc3QuIEl0IGNhbiBiZSBlbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmsge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICBkZWxpdmVyeV9tZXRob2Q/OiBIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2Q7XG4gICAgLyoqXG4gICAgICogVVJJIHRoYXQgSG9zdGVkIExpbmsgd2lsbCByZWRpcmVjdCB0byB1cG9uIGNvbXBsZXRpb24gb2YgdGhlIExpbmsgZmxvdy4gVGhpcyB3aWxsIG9ubHkgb2NjdXIgaW4gSG9zdGVkIExpbmsgc2Vzc2lvbnMsIG5vdCBpbiBvdGhlciBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgY29tcGxldGlvbl9yZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgc2Vjb25kcyB0aGUgbGluayB3aWxsIGJlIHZhbGlkIGZvci4gTXVzdCBiZSBwb3NpdGl2ZS4gQ2Fubm90IGJlIGxvbmdlciB0aGFuIDIxIGRheXMuIFRoZSBkZWZhdWx0IGxpZmV0aW1lIGlzIDcgZGF5cyBmb3IgbGlua3MgZGVsaXZlcmVkIGJ5IGVtYWlsLCAxIGRheSBmb3IgbGlua3MgZGVsaXZlcmVkIHZpYSBTTVMsIGFuZCAzMCBtaW51dGVzIGZvciBsaW5rcyBub3Qgc2VudCB2aWEgUGxhaWQgTGluayBkZWxpdmVyeS4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgb2YgYWxsIHRocmVlIGxpbmsgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICB1cmxfbGlmZXRpbWVfc2Vjb25kcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGllbnQgaXMgb3BlbmluZyBob3N0ZWQgTGluayBpbiBhIG1vYmlsZSBhcHAgaW4gYW4gb3V0IG9mIHByb2Nlc3Mgd2ViIHZpZXcgKE9PUFdWKSAoaS5lLiwgYW4gYEFzV2ViQXV0aGVudGljYXRpb25TZXNzaW9uYCAvIGBTRlNhZmFyaVZpZXdDb250cm9sbGVyYCBvciBBbmRyb2lkIEN1c3RvbSBUYWIpLiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGlzX21vYmlsZV9hcHA/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJZGVudGl0eSBvYmplY3QgdXNlZCB0byBzcGVjaWZ5IGRvY3VtZW50IHVwbG9hZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIElkZW50aXR5IERvY3VtZW50IFVwbG9hZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICAgICAqL1xuICAgIGlzX2RvY3VtZW50X3VwbG9hZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYC4gQ3VycmVudGx5IGNhbiBvbmx5IGNvbnRhaW4gb25lIGBhY2NvdW50X2lkYC4gTXVzdCBiZSBwb3B1bGF0ZWQgaWYgdXNpbmcgRG9jdW1lbnQgVXBsb2FkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXJzaW5nIGNvbmZpZ3VyYXRpb25zLiBWYWxpZCBwYXJzaW5nIGNvbmZpZ3VyYXRpb25zIGFyZSBgb2NyYCBhbmQgYHJpc2tfc2lnbmFsc2AuIElmIHBhcnNpbmcgY29uZmlndXJhdGlvbnMgYXJlIG9taXR0ZWQsIGRlZmF1bHRzIHRvIGBvY3JgXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlncz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdXNlZCB0byBoaWdobGlnaHQgaW5zdGl0dXRpb25zIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBiYW5rIHRvIGhpZ2hsaWdodCBpbiBMaW5rLiBOb3RlOiBpbiByYXJlIGNhc2VzLCBhIHNpbmdsZSByb3V0aW5nIG51bWJlciBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIGluc3RpdHV0aW9ucywgZS5nLiBkdWUgdG8gYSBicm9rZXJhZ2UgdXNpbmcgYW5vdGhlciBpbnN0aXR1dGlvbiB0byBtYW5hZ2UgQUNIIG9uIGl0cyBzd2VlcCBhY2NvdW50cy4gSWYgdGhpcyBoYXBwZW5zLCB0aGUgYmFuayB3aWxsIG5vdCBiZSBoaWdobGlnaHRlZCBpbiBMaW5rIGV2ZW4gaWYgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBsaWNhdGlvbiwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBMaW5rLiBNYXhpbXVtIGxlbmd0aCBvZiAzMCBjaGFyYWN0ZXJzLiBJZiBhIHZhbHVlIGxvbmdlciB0aGFuIDMwIGNoYXJhY3RlcnMgaXMgcHJvdmlkZWQsIExpbmsgd2lsbCBkaXNwbGF5IFxcXCJUaGlzIEFwcGxpY2F0aW9uXFxcIiBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYW5ndWFnZSB0aGF0IExpbmsgc2hvdWxkIGJlIGRpc3BsYXllZCBpbi4gV2hlbiBpbml0aWFsaXppbmcgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24sIHRoaXMgZmllbGQgaXMgbm90IHVzZWQ7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHN1cHBvcnRlZCBsYW5ndWFnZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi8jc3VwcG9ydGVkLWxhbmd1YWdlcykuICBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogLSBEYW5pc2ggKGBcXCdkYVxcJ2ApIC0gRHV0Y2ggKGBcXCdubFxcJ2ApIC0gRW5nbGlzaCAoYFxcJ2VuXFwnYCkgLSBFc3RvbmlhbiAoYFxcJ2V0XFwnYCkgLSBGcmVuY2ggKGBcXCdmclxcJ2ApIC0gR2VybWFuIChgXFwnZGVcXCdgKSAtIEhpbmRpIChgXFwnaGlcXCdgKSAtIEl0YWxpYW4gKGBcXCdpdFxcJ2ApIC0gTGF0dmlhbiAoYFxcJ2x2XFwnYCkgLSBMaXRodWFuaWFuIChgXFwnbHRcXCdgKSAtIE5vcndlZ2lhbiAoYFxcJ25vXFwnYCkgLSBQb2xpc2ggKGBcXCdwbFxcJ2ApIC0gUG9ydHVndWVzZSAoYFxcJ3B0XFwnYCkgLSBSb21hbmlhbiAoYFxcJ3JvXFwnYCkgLSBTcGFuaXNoIChgXFwnZXNcXCdgKSAtIFN3ZWRpc2ggKGBcXCdzdlxcJ2ApIC0gVmlldG5hbWVzZSAoYFxcJ3ZpXFwnYCkgIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBjb25maWd1cmVkIGhlcmUgbXVzdCBtYXRjaCB0aGUgc2V0dGluZyBpbiB0aGUgY3VzdG9taXphdGlvbiwgb3IgdGhlIGN1c3RvbWl6YXRpb24gd2lsbCBub3QgYmUgYXBwbGllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbnN0aXR1dGlvbnMgZnJvbSBhbGwgbGlzdGVkIGNvdW50cmllcyB3aWxsIGJlIHNob3duLiBGb3IgYSBjb21wbGV0ZSBtYXBwaW5nIG9mIHN1cHBvcnRlZCBwcm9kdWN0cyBieSBjb3VudHJ5LCBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsLy4gIElmIHVzaW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgYGNvdW50cnlfY29kZXNgIHNob3VsZCBiZSBzZXQgdG8gdGhlIGNvdW50cnkgd2hlcmUgeW91ciBjb21wYW55IGlzIGJhc2VkLCBub3QgdGhlIGNvdW50cnkgd2hlcmUgeW91ciB1c2VyIGlzIGxvY2F0ZWQuIEZvciBhbGwgb3RoZXIgcHJvZHVjdHMsIGBjb3VudHJ5X2NvZGVzYCByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB5b3VyIHVzZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIElmIExpbmsgaXMgbGF1bmNoZWQgd2l0aCBtdWx0aXBsZSBjb3VudHJ5IGNvZGVzLCBvbmx5IHByb2R1Y3RzIHRoYXQgeW91IGFyZSBlbmFibGVkIGZvciBpbiBhbGwgY291bnRyaWVzIHdpbGwgYmUgdXNlZCBieSBMaW5rLiBOb3RlIHRoYXQgd2hpbGUgYWxsIGNvdW50cmllcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IGluIFNhbmRib3gsIGluIFByb2R1Y3Rpb24gb25seSBVUyBhbmQgQ2FuYWRhIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucywgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLCBvciB0aGUgY3VzdG9taXphdGlvbiBtYXkgbm90IGJlIGFwcGxpZWQuICBJZiB1c2luZyB0aGUgQXV0aCBmZWF0dXJlcyBJbnN0YW50IE1hdGNoLCBJbnN0YW50IE1pY3JvLWRlcG9zaXRzLCBTYW1lLWRheSBNaWNyby1kZXBvc2l0cywgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBvciBEYXRhYmFzZSBJbnNpZ2h0cywgYGNvdW50cnlfY29kZXNgIG11c3QgYmUgc2V0IHRvIGBbXFwnVVNcXCddYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byB1c2UuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZCAodW5sZXNzIHlvdSBhcmUgdXNpbmcgdXBkYXRlIG1vZGUgdG8gYWRkIEluY29tZSBvciBBc3NldHMgdG8gYW4gSXRlbSk7IHJlcXVpcmVkIG90aGVyd2lzZS4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbml0aWFsaXplZCB3aGVuIGFueSBvdGhlciBwcm9kdWN0IGlzIGluaXRpYWxpemVkLiAgVGhlIHByb2R1Y3RzIHNwZWNpZmllZCBoZXJlIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIGluc3RpdHV0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3VyIHVzZXJzIGluIExpbmsuIE9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCAqYWxsKiByZXF1ZXN0ZWQgcHJvZHVjdHMgY2FuIGJlIHNlbGVjdGVkOyBhIGlmIGEgdXNlciBhdHRlbXB0cyB0byBzZWxlY3QgYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEgbGlzdGVkIHByb2R1Y3QsIGEgXFxcIkNvbm5lY3Rpdml0eSBub3Qgc3VwcG9ydGVkXFxcIiBlcnJvciBtZXNzYWdlIHdpbGwgYXBwZWFyIGluIExpbmsuIFRvIG1heGltaXplIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSwgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIG1pbmltYWwgcHJvZHVjdCBzZXQgcmVxdWlyZWQgZm9yIHlvdXIgdXNlIGNhc2UuICAgQWRkaXRpb25hbCBwcm9kdWN0cyBjYW4gYmUgaW5jbHVkZWQgdmlhIHRoZSBbYG9wdGlvbmFsX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1vcHRpb25hbC1wcm9kdWN0cykgb3IgIFtgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1yZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpIGZpZWxkcy4gUHJvZHVjdHMgY2FuIGFsc28gYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB0aGUgZW5kcG9pbnQgYWZ0ZXIgb2J0YWluaW5nIGFuIGFjY2VzcyB0b2tlbjsgdGhpcyBtYXkgcmVxdWlyZSB0aGUgcHJvZHVjdCB0byBiZSBsaXN0ZWQgaW4gdGhlIFtgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LWFkZGl0aW9uYWwtY29uc2VudGVkLXByb2R1Y3RzKSBhcnJheS4gRm9yIGRldGFpbHMsIHNlZSBbQ2hvb3Npbmcgd2hlbiB0byBpbml0aWFsaXplIHByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLykuICBOb3RlIHRoYXQsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCB0byBkaXNhYmxlIEluc3RhbnQgTWF0Y2ggc3VwcG9ydCwgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IE1hdGNoIHdpbGwgYWxzbyBiZSBzaG93biBpbiBMaW5rIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBldmVuIHRob3VnaCB0aGVzZSBpbnN0aXR1dGlvbnMgZG8gbm90IGNvbnRhaW4gYGF1dGhgIGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuICBJbiBQcm9kdWN0aW9uLCB5b3Ugd2lsbCBiZSBiaWxsZWQgZm9yIGVhY2ggcHJvZHVjdCB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE5vdGUgdGhhdCBhIHByb2R1Y3QgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSBhbiBJdGVtIG9uY2UgdGhlIEl0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IHByb2R1Y3QuIFRvIHN0b3AgYmlsbGluZyBvbiBhbiBJdGVtIGZvciBzdWJzY3JpcHRpb24tYmFzZWQgcHJvZHVjdHMsIHN1Y2ggYXMgTGlhYmlsaXRpZXMsIEludmVzdG1lbnRzLCBhbmQgVHJhbnNhY3Rpb25zLCByZW1vdmUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZSBvbmx5IGlmIHRoZSBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudChzKSBzZWxlY3RlZCBieSB0aGUgdXNlciBzdXBwb3J0IHRoZSBwcm9kdWN0LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIHN0aWxsIGJlIHNob3duIGluIExpbmsuIFRoZSBwcm9kdWN0cyB3aWxsIG9ubHkgYmUgZXh0cmFjdGVkIGFuZCBiaWxsZWQgaWYgdGhlIHVzZXIgc2VsZWN0cyBhbiBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudCB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlbS4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXlzLiBUaGUgYHByb2R1Y3RzYCBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHByb2R1Y3QuICBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoaXMgZmVhdHVyZSwgc2VlIFtSZXF1aXJlZCBpZiBTdXBwb3J0ZWQgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHdpbGwgZW5oYW5jZSB0aGUgY29uc3VtZXJcXCdzIHVzZSBjYXNlLCBidXQgdGhhdCB5b3VyIGFwcCBjYW4gZnVuY3Rpb24gd2l0aG91dC4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGZldGNoIGRhdGEgZm9yIHRoZXNlIHByb2R1Y3RzIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMsIGFuZCBmYWlsdXJlIHRvIHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYWZmZWN0IEl0ZW0gY3JlYXRpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW09wdGlvbmFsIFByb2R1Y3RzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jb3B0aW9uYWwtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25hbF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhZGRpdGlvbmFsIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gY29sbGVjdCBjb25zZW50IGZvciB0byBzdXBwb3J0IHlvdXIgdXNlIGNhc2UuIFRoZXNlIHByb2R1Y3RzIHdpbGwgbm90IGJlIGJpbGxlZCB1bnRpbCB5b3Ugc3RhcnQgdXNpbmcgdGhlbSBieSBjYWxsaW5nIHRoZSByZWxldmFudCBlbmRwb2ludHMuICBgYmFsYW5jZWAgaXMgKm5vdCogYSB2YWxpZCB2YWx1ZSwgdGhlIEJhbGFuY2UgcHJvZHVjdCBkb2VzIG5vdCByZXF1aXJlIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBjb25zZW50IGNvbGxlY3RlZC4gIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2Agb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXlzLiAgSWYgeW91IGluY2x1ZGUgYHNpZ25hbGAgaW4gYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCwgeW91IHdpbGwgbmVlZCB0byBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGJlZm9yZSBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYW4gSXRlbSBpbiBvcmRlciB0byBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVzdWx0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtVc2luZyBgL3NpZ25hbC9wcmVwYXJlYF0oL2RvY3Mvc2lnbmFsLyN1c2luZy1zaWduYWxwcmVwYXJlKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggYW55IHdlYmhvb2tzIHNob3VsZCBiZSBzZW50LiBOb3RlIHRoYXQgd2ViaG9va3MgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiAoZS13YWxsZXQgdHJhbnNhY3Rpb25zIG9ubHkpLCBUcmFuc2ZlciwgQmFuayBUcmFuc2ZlciAoaW5jbHVkaW5nIEF1dGggbWljcm8tZGVwb3NpdCBub3RpZmljYXRpb24gd2ViaG9va3MpLCBNb25pdG9yLCBJZGVudGl0eSBWZXJpZmljYXRpb24sIGFuZCBMaW5rIEV2ZW50cyBhcmUgY29uZmlndXJlZCB2aWEgdGhlIERhc2hib2FyZCBpbnN0ZWFkLiBJbiB1cGRhdGUgbW9kZSwgdGhpcyBmaWVsZCB3aWxsIG5vdCBoYXZlIGFuIGVmZmVjdDsgdG8gdXBkYXRlIHRoZSB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBhbiBleGlzdGluZyBJdGVtLCB1c2UgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gdG8gdXBkYXRlIG9yIHJlZmVyZW5jZSwgdXNlZCB3aGVuIHVwZGF0aW5nLCBtb2RpZnlpbmcsIG9yIGFjY2Vzc2luZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYC4gVXNlZCB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCB3aGVuIGNvbXBsZXRpbmcgdGhlIFNhbWUtZGF5IChtYW51YWwpIE1pY3JvLWRlcG9zaXQgZmxvdywgb3IgKG9wdGlvbmFsbHkpIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsgZm9yIGEgcmV0dXJuaW5nIHVzZXIgYXMgcGFydCBvZiB0aGUgVHJhbnNmZXIgVUkgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW1zIHRvIHVwZGF0ZSBpbiBMaW5rIHVwZGF0ZSBtb2RlIGZvciB0aGUgQXNzZXRzIHByb2R1Y3QuIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiB0aGUgYGFjY2Vzc190b2tlbmAgZmllbGQgYWxsb3dzIHRoZSB1cGRhdGluZyBvZiBtdWx0aXBsZSBpdGVtcyBhdCBvbmNlLiBUaGlzIGZlYXR1cmUgaXMgaW4gY2xvc2VkIGJldGEsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm8uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgTGluayBjdXN0b21pemF0aW9uIGZyb20gdGhlIFBsYWlkIERhc2hib2FyZCB0byBiZSBhcHBsaWVkIHRvIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBgZGVmYXVsdGAgY3VzdG9taXphdGlvbiB3aWxsIGJlIHVzZWQuIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBpbiB0aGUgY3VzdG9taXphdGlvbiBtdXN0IG1hdGNoIHRoZSBsYW5ndWFnZSBzZWxlY3RlZCB2aWEgdGhlIGBsYW5ndWFnZWAgcGFyYW1ldGVyLCBhbmQgdGhlIGNvdW50cmllcyBpbiB0aGUgY3VzdG9taXphdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGNvdW50cnkgY29kZXMgc2VsZWN0ZWQgdmlhIGBjb3VudHJ5X2NvZGVzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jdXN0b21pemF0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkkgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24gd2hlcmUgYSB1c2VyIHNob3VsZCBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciBhbm90aGVyIGFwcC4gVGhlIGByZWRpcmVjdF91cmlgIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIG11c3QgYmUgYW4gaHR0cHMgVVJJLiBUbyBzcGVjaWZ5IGFueSBzdWJkb21haW4sIHVzZSBgKmAgYXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIsIGUuZy4gYGh0dHBzOi8vXyouZXhhbXBsZS5jb20vb2F1dGguaHRtbGAuIE5vdGUgdGhhdCBhbnkgcmVkaXJlY3QgVVJJIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCByZWRpcmVjdCBVUklzIGxpc3QgaW4gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBJZiBpbml0aWFsaXppbmcgb24gQW5kcm9pZCwgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIHNwZWNpZmllZCBpbnN0ZWFkIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwXFwncyBBbmRyb2lkIHBhY2thZ2UuIFJlcXVpcmVkIGlmIHVzaW5nIHRoZSBgbGlua190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIG9uIEFuZHJvaWQuIEFueSBwYWNrYWdlIG5hbWUgc3BlY2lmaWVkIGhlcmUgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIEFuZHJvaWQgcGFja2FnZSBuYW1lcyBzZXR0aW5nIG9uIHRoZSBbZGV2ZWxvcGVyIGRhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKS4gV2hlbiBjcmVhdGluZyBhIGBsaW5rX3Rva2VuYCBmb3IgaW5pdGlhbGl6aW5nIExpbmsgb24gb3RoZXIgcGxhdGZvcm1zLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgbGVmdCBibGFuayBhbmQgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW5kcm9pZF9wYWNrYWdlX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2RhdGE/OiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2h9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjYXJkX3N3aXRjaD86IExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2g7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkFjY291bnRGaWx0ZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogTGlua1Rva2VuQWNjb3VudEZpbHRlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkVVQ29uZmlnfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXVfY29uZmlnPzogTGlua1Rva2VuRVVDb25maWc7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgY2VydGFpbiBFdXJvcGUtb25seSBjb25maWd1cmF0aW9ucywgYXMgd2VsbCBhcyBjZXJ0YWluIGxlZ2FjeSB1c2UgY2FzZXMgaW4gb3RoZXIgcmVnaW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfY29uZmlndXJhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2g/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyYV9vcHRpb25zPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlICYgc3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U/OiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSAmIHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGh9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXBkYXRlPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cztcbiAgICAvKipcbiAgICAgKiBBIHVzZXIgdG9rZW4gZ2VuZXJhdGVkIHVzaW5nIGAvdXNlci9jcmVhdGVgLiBBbnkgSXRlbSBjcmVhdGVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5JbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogTGlua1Rva2VuSW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzX2F1dGg/OiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmt9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBob3N0ZWRfbGluaz86IExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlblRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IExpbmtUb2tlblRyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHJlcXVlc3QgYSBDUkEgY29ubmVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyYV9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgaW5kaWNhdGVzIHRoYXQgY2xpZW50IHN1cHBvcnRzIGxpbmtpbmcgRmluYW5jZUtpdCAvIEFwcGxlQ2FyZCBpdGVtcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZpbmFuY2VraXRfc3VwcG9ydGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGVuYWJsZSBsaW5raW5nIG11bHRpcGxlIGl0ZW1zIGluIHRoZSBzYW1lIExpbmsgc2Vzc2lvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuYWJsZV9tdWx0aV9pdGVtX2xpbms/OiBib29sZWFuO1xufVxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgb25seSBkaXNwbGF5IGFjY291bnQgdHlwZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuICBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBGb3IgaW5zdGl0dXRpb25zIHVzaW5nIE9BdXRoLCB0aGUgZmlsdGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgbGlzdCBvZiBpbnN0aXR1dGlvbnMgb3IgYWNjb3VudHMgc2hvd24gYnkgdGhlIGJhbmsgaW4gdGhlIE9BdXRoIHdpbmRvdy4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBsb2FuPzogTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBBdXRoIHByb2R1Y3QuIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgZXh0ZW5kZWQgQXV0aCBmbG93cyBmb3IgdGhlIHJlc3VsdGluZyBMaW5rIHNlc3Npb24uIE9taXR0aW5nIGFueSBmaWVsZCB3aWxsIHJlc3VsdCBpbiBhIGRlZmF1bHQgdGhhdCBjYW4gYmUgY29uZmlndXJlZCBieSB5b3VyIGFjY291bnQgbWFuYWdlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRoYXQgd2lsbCBhcHBseSBpZiB5b3UgaGF2ZSBub3QgcmVxdWVzdGVkIHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGFwcGx5IGEgZGlmZmVyZW50IGRlZmF1bHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGgge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIEF1dGggVHlwZSBTZWxlY3QgaXMgZW5hYmxlZCBmb3IgdGhlIExpbmsgc2Vzc2lvbiwgYWxsb3dpbmcgdGhlIGVuZCB1c2VyIHRvIGNob29zZSBiZXR3ZWVuIGxpbmtpbmcgdmlhIGEgY3JlZGVudGlhbHMtYmFzZWQgZmxvdyAoaS5lLiBJbnN0YW50IEF1dGgsIEluc3RhbnQgTWF0Y2gsIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cykgb3IgYSBtYW51YWwgZmxvdyB0aGF0IGRvZXMgbm90IHJlcXVpcmUgbG9naW4gKGFsbCBvdGhlciBBdXRoIGZsb3dzKSBwcmlvciB0byBzZWxlY3RpbmcgdGhlaXIgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0aF90eXBlX3NlbGVjdF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgZmxvdy4gRGVmYXVsdCBiZWhhdmlvciBpcyBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGF1dG9tYXRlZF9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWF0Y2ggZmxvdy4gSW5zdGFudCBNYXRjaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIEluc3RhbnQgTWF0Y2ggY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhpcyBmaWVsZCB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBzYW1lX2RheV9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWljcm8tZGVwb3NpdHMgZmxvdy4gIERlZmF1bHQgYmVoYXZpb3IgZm9yIFBsYWlkIHRlYW1zIGNyZWF0ZWQgYWZ0ZXIgTm92ZW1iZXIgMjAyMyBpcyBgZmFsc2VgOyBkZWZhdWx0IGJlaGF2aW9yIGZvciBQbGFpZCB0ZWFtcyBjcmVhdGVkIGJlZm9yZSB0aGF0IGRhdGUgaXMgYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hhdCB0eXBlIG9mIFtSZXJvdXRlIHRvIENyZWRlbnRpYWxzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2Uvc2FtZS1kYXkvI3Jlcm91dGUtdG8tY3JlZGVudGlhbHMpIHBhbmUgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3cuIERlZmF1bHQgYmVoYXZpb3IgaXMgYE9QVElPTkFMYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHJlcm91dGVfdG9fY3JlZGVudGlhbHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBEYXRhYmFzZSBNYXRjaCBmbG93LiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgZGF0YWJhc2VfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgRGF0YWJhc2UgSW5zaWdodHMgZmxvdy4gRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyBmb3IgYWNjZXNzLCBjb250YWN0IHlvdXIgQWNjb3VudCBNYW5hZ2VyLiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgZGF0YWJhc2VfaW5zaWdodHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBhdXRoX3R5cGVfc2VsZWN0X2VuYWJsZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmbG93X3R5cGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIFNNUyBtaWNyby1kZXBvc2l0cyB2ZXJpZmljYXRpb24uIERlZmF1bHQgYmVoYXZpb3IgaXMgYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHNtc19taWNyb2RlcG9zaXRzX3ZlcmlmaWNhdGlvbl9lbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bSB7XG4gICAgT2ZmID0gJ09GRicsXG4gICAgT3B0aW9uYWwgPSAnT1BUSU9OQUwnLFxuICAgIEZvcmNlZCA9ICdGT1JDRUQnXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtIHtcbiAgICBGbGV4aWJsZUF1dGggPSAnRkxFWElCTEVfQVVUSCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBCYXNlIFJlcG9ydCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBhc3NldHNgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCB0aGUgY2xpZW50IGlzIENSQS1lbmFibGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIFBsYWlkIENoZWNrIHByb2R1Y3RzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gUGxhaWQgQ2hlY2sgcHJvZHVjdHMuIERlZmF1bHQgdmFsdWUgaXMgMzY1OyBtYXhpbXVtIGlzIDczMDsgbWluaW11bSBpcyAxODAuIElmIGEgdmFsdWUgbG93ZXIgdGhhbiAxODAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAxODAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHJlcXVpcmVkIGZvciB0aGUgcmVwb3J0IHRvIGJlIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVpcmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXJ0bmVyX2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGNhc2hmbG93X2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBCYXNlIFJlcG9ydCBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgUGxhaWQgQ2hlY2sgc2NvcmUgdG8gcmV0dXJuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgcGxhaWRfY2hlY2tfc2NvcmVfdmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93QXR0cmlidXRlc1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgUHJpc20gcHJvZHVjdHMgdG8gcmV0dXJuLiBJZiBub25lIGFyZSBwYXNzZWQgaW4sIHRoZW4gYWxsIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFByaXNtUHJvZHVjdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fcHJvZHVjdHM/OiBBcnJheTxQcmlzbVByb2R1Y3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbVZlcnNpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENyZWRpdCBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gY29tcHV0ZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cy4gRGVmYXVsdHMgdG8gMTgwIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIFByaXNtIHByb2R1Y3RzIHRvIHJldHVybi4gSWYgbm9uZSBhcmUgcGFzc2VkIGluLCB0aGVuIGFsbCBwcm9kdWN0cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcmlzbVByb2R1Y3Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fcHJvZHVjdHM/OiBBcnJheTxQcmlzbVByb2R1Y3Q+O1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgRGVwb3NpdCBTd2l0Y2ggKGJldGEpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGRlcG9zaXRfc3dpdGNoYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaCB7XG4gICAgLyoqXG4gICAgICogVGhlIGBkZXBvc2l0X3N3aXRjaF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEVtcGxveW1lbnQgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZW1wbG95bWVudGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95bWVudF9zb3VyY2VfdHlwZXM/OiBBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWU7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggQmFuayBFbXBsb3ltZW50LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgZW1wbG95bWVudF9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9uIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGFncmVlZCB0byBhIHByaXZhY3kgcG9saWN5IHNwZWNpZnlpbmcgdGhhdCB0aGVpciBkYXRhIHdpbGwgYmUgc2hhcmVkIHdpdGggUGxhaWQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIElmIGBnYXZlX2NvbnNlbnRgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCB3aWxsIGJlIG1hcmtlZCBhcyBgc2tpcHBlZGAgYW5kIHRoZSBlbmQgdXNlclxcJ3Mgc2Vzc2lvbiB3aWxsIHN0YXJ0IGF0IHRoZSBuZXh0IHN0ZXAgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGdhdmVfY29uc2VudD86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEluY29tZSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgb2YgdGhlIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSwgYXMgcHJvdmlkZWQgYnkgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuIFJlcGxhY2VkIGJ5IHRoZSB1c2VyIHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIG9mIGFuIGFzc2V0IHJlcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGFzIHByb3ZpZGVkIGJ5IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFByb3ZpZGluZyBhbiBgYXNzZXRfcmVwb3J0X2lkYCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSB1c2VyIHRocm91Z2ggYSBzdHJlYW1saW5lZCBmbG93LiBJZiBwcm92aWRlZCwgdGhlIGJhbmsgbGlua2luZyBmbG93IHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyB0aGF0IGEgdXNlciBoYXMgcHJldmlvdXNseSBjb25uZWN0ZWQgd2l0aC4gRGF0YSBmcm9tIHRoZXNlIGluc3RpdHV0aW9ucyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBkb2N1bWVudCBkYXRhIHJlY2VpdmVkIGR1cmluZyB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gaGVscCB2ZXJpZnkgdGhhdCB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGFyZSBhY2N1cmF0ZS4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIHByb2R1Y3Qgd2FzIG5vdCBpbml0aWFsaXplZCBmb3IgdGhlc2UgSXRlbXMgZHVyaW5nIGxpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uICBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgYHBheXJvbGxgIGluY29tZSBzb3VyY2UgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2Ygc291cmNlIGluY29tZSBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWU7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHVzZXIgc3RhdGVkIGluY29tZSBzb3VyY2VzXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXRlZF9pbmNvbWVfc291cmNlcz86IEFycmF5PExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlPjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIGBiYW5rYCBpcyBzcGVjaWZpZWQgaW4gYGluY29tZV9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgQmFuayBJbmNvbWUgcHJvZHVjdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBtdWx0aXBsZSBJdGVtcyB0byBiZSBhZGRlZCBpbiB0aGUgTGluayBzZXNzaW9uLiBUaGlzIHNldHRpbmcgaXMgZGVwcmVjYXRlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG1vcmUgZ2VuZXJhbCBgZW5hYmxlX211bHRpX2l0ZW1fbGlua2Agc2V0dGluZywgd2hpY2ggc3VwcG9ydHMgYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW5hYmxlX211bHRpcGxlX2l0ZW1zPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGF5cm9sbCBJbmNvbWUgKGluY2x1ZGluZyBEb2N1bWVudCBJbmNvbWUpLiBGdXJ0aGVyIGN1c3RvbWl6YXRpb24gb3B0aW9ucyBmb3IgRG9jdW1lbnQgSW5jb21lLCBzdWNoIGFzIGN1c3RvbWl6aW5nIHdoaWNoIGRvY3VtZW50IHR5cGVzIG1heSBiZSB1cGxvYWRlZCwgYXJlIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgW0xpbmsgQ3VzdG9taXphdGlvbiBwYW5lXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vbGluaykgaW4gdGhlIERhc2hib2FyZC4gKFJlcXVpcmVzIFByb2R1Y3Rpb24gZW5hYmxlbWVudC4pXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gdG8gZW5hYmxlIGZvciB0aGUgTGluayBzZXNzaW9uLiBJZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlcnMgd2lsbCBzZWUgYm90aCBkb2N1bWVudCBhbmQgZGlnaXRhbCBwYXlyb2xsIGluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBmbG93X3R5cGVzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIExpbmsgdG9rZW4gd2lsbCBiZSB1c2VkIGZvciB1cGRhdGUgbW9kZS4gVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBpc191cGRhdGVfbW9kZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBJdGVtIHRvIHVwZGF0ZSB3aXRoLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGl0ZW1faWRfdG9fdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2YgYW5hbHlzaXMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCB1cGxvYWRzLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBkb2NzIHdpbGwgdW5kZXJnbyBPQ1IgcGFyc2luZyBvbmx5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBwYXJzaW5nX2NvbmZpZz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+IHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5IEJ5IEJhbmsgZmxvdy4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCB0byBjb25maWd1cmUgdGhlIHVzZXIgZXhwZXJpZW5jZSwgYW5kIGN1cnJlbnRseSByZXF1aXJlcyB0aGUgYW1vdW50IGZpZWxkIHRvIGJlIHNldC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIgdGhhdCBwcm92aWRlcyB0aGUgcGF5bWVudCBjb250ZXh0LiBUaGUgbWF4IGxlbmd0aCBpcyAyNTYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBwYXltZW50X2luaXRpYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LiBFaXRoZXIgYHBheW1lbnRfaWRgIG9yIGBjb25zZW50X2lkYCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY29uc2VudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBTdGF0ZW1lbnRzIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzdGF0ZW1lbnRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIGZvciBzdGF0ZW1lbnRzLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBcXFwiWVlZWS1NTS1ERFxcXCIgZm9ybWF0LCBlLmcuIFxcXCIyMDIwLTEwLTMwXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBUcmFuc2ZlciBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaWRgIHJldHVybmVkIGJ5IHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICAgICAqL1xuICAgIGludGVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCByZXR1cm5lZCBieSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQuIFVzZWQgdG8gaW5kaWNhdGUgTGluayBzZXNzaW9uIHRvIGNvbXBsZXRlIHJlcXVpcmVkIHVzZXIgYWN0aW9uIGluIG9yZGVyIHRvIG1ha2UgYSBkZWNpc2lvbiBmb3IgdGhlIGF1dGhvcml6YXRpb24uIElmIHNldCwgYGFjY2Vzc190b2tlbmAgY2FuIGJlIG9taXR0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGUge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgZW5hYmxlcyBbdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLyN1c2luZy11cGRhdGUtbW9kZS10by1yZXF1ZXN0LW5ldy1hY2NvdW50cykgZm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgYW5kIENhbmFkYSB0aGF0IGRvIG5vdCB1c2UgT0F1dGgsIG9yIHRoYXQgdXNlIE9BdXRoIGJ1dCBkbyBub3QgaGF2ZSB0aGVpciBvd24gYWNjb3VudCBzZWxlY3Rpb24gZmxvdy4gRm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgdGhhdCBoYXZlIGFuIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3cgKGkuZS4gbW9zdCBPQXV0aC1lbmFibGVkIGluc3RpdHV0aW9ucyksIHVwZGF0ZSBtb2RlIHdpdGggQWNjb3VudCBTZWxlY3Qgd2lsbCBhbHdheXMgYmUgZW5hYmxlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfc2VsZWN0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIFBsYWlkIHdpbGwgZW5hYmxlIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdyBkdXJpbmcgdXBkYXRlIG1vZGUgZm9yIGFuIEl0ZW0gZW5hYmxlZCBmb3IgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvKSBpZiB0aGUgSXRlbSBleHBpcmVzIHdpdGhpbiBzaXggbW9udGhzLiBEdXJpbmcgYSByZWF1dGhvcml6YXRpb24gZmxvdywgYW4gZW5kIHVzZXIgd2lsbCByZXZpZXcgUGxhaWRcXCdzIGVuZCB1c2VyIHByaXZhY3kgcG9saWN5LCB1c2UgY2FzZSBhbmQgZGF0YSBzY29wZSBjb25zZW50cywgYW5kIGFjY291bnQgYWNjZXNzIGNvbnNlbnRzOyB0aGV5IG1heSBhbHNvIGJlIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb25cXCdzIE9BdXRoIGZsb3cuIEFmdGVyIHRoZSBlbmQgdXNlciBzdWNjZXNzZnVsbHkgY29tcGxldGVzIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdywgdGhlIEl0ZW1cXCdzIGV4cGlyYXRpb24gZGF0ZSB3aWxsIGJlIGV4dGVuZGVkIHRvIDEyIG1vbnRocyBmcm9tIHRoZSB0aW1lIHRoYXQgdGhlIHJlYXV0aG9yaXphdGlvbiB0b29rIHBsYWNlLiBUaGlzIGZpZWxkIGFsbG93cyB5b3UgdG8gb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWF1dGhvcml6YXRpb24gc2NoZWR1bGluZyBsb2dpYyB0byBlaXRoZXIgZm9yY2libHkgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlYXV0aG9yaXphdGlvbiBmbG93IGZvciBhIGdpdmVuIHVwZGF0ZSBtb2RlIHNlc3Npb24uIFRoaXMgZmllbGQgZG9lcyBub3QgaW1wYWN0IHRoZSBmbG93IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgaW4gdGhlIEVVIG9yIFVLLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgcmVhdXRob3JpemF0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgYSBgdXNlcl90b2tlbmAgbXVzdCBhbHNvIGJlIHByb3ZpZGVkLCBhbmQgTGluayB3aWxsIG9wZW4gaW4gdXBkYXRlIG1vZGUgZm9yIHRoZSBnaXZlbiB1c2VyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgdXNlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG8gYmUgdXBkYXRlZCBpbiB1cGRhdGUgbW9kZS4gSWYgZW1wdHkgb3IgYG51bGxgLCB0aGlzIGZpZWxkIHdpbGwgZGVmYXVsdCB0byBpbml0aWFsaXppbmcgdXBkYXRlIG1vZGUgZm9yIHRoZSBtb3N0IHJlY2VudCB1bmhlYWx0aHkgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIEEgYHVzZXJfdG9rZW5gIG11c3QgYWxzbyBiZSBwcm92aWRlZCB0byB1c2UgdGhpcyBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgd2hvIHdpbGwgYmUgbGlua2luZyB0aGVpciBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLiBJdCBpcyBjdXJyZW50bHkgdXNlZCBhcyBhIG1lYW5zIG9mIHNlYXJjaGluZyBsb2dzIGZvciB0aGUgZ2l2ZW4gdXNlciBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZnVsbCBsZWdhbCBuYW1lLCB1c2VkIGZvciBbbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gZmxvd3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS8pLiBGb3IgYSBzbWFsbCBudW1iZXIgb2YgY3VzdG9tZXJzIG9uIGxlZ2FjeSBmbG93cywgcHJvdmlkaW5nIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIG1pY3JvLWRlcG9zaXQtYmFzZWQgZmxvd3MuIEZvciBhbGwgb3RoZXIgY3VzdG9tZXJzLCB0aGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBQcm92aWRpbmcgdGhlIHVzZXJcXCdzIG5hbWUgaW4gdGhpcyBmaWVsZCB3aGVuIHVzaW5nIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIHdpbGwgc3RyZWFtbGluZSB0aGUgZW5kIHVzZXIgZXhwZXJpZW5jZSwgYXMgdGhlIHVzZXIgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBkdXJpbmcgdGhlIExpbmsgZmxvdzsgUGxhaWQgd2lsbCB1c2UgdGhlIHByb3ZpZGVkIGxlZ2FsIG5hbWUgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyIGluIFtFLjE2NF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRS4xNjQpIGZvcm1hdC4gSWYgc3VwcGxpZWQsIHdpbGwgYmUgdXNlZCB3aGVuIGFwcGxpY2FibGUgdG8gcHJlZmlsbCBwaG9uZSBudW1iZXIgZmllbGRzIGluIExpbmsgZm9yIHRoZSBbcmV0dXJuaW5nIHVzZXIgZmxvd10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikgYW5kIHRoZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3ddKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIENhbiBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIGVtYWlsIGFkZHJlc3Mgd2FzIHZlcmlmaWVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUaGg6bW06c3NaYCkuIFRoaXMgd2FzIHByZXZpb3VzbHkgYW4gb3B0aW9uYWwgZmllbGQgdXNlZCBpbiB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZS4gICBPbmx5IHBhc3MgYSB2ZXJpZmljYXRpb24gdGltZSBmb3IgYW4gZW1haWwgYWRkcmVzcyB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3NfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBhbmQgbm90IGN1cnJlbnRseSB1c2VkLCB1c2UgdGhlIGBpZF9udW1iZXJgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUbyBiZSBwcm92aWRlZCBpbiB0aGUgZm9ybWF0IFxcXCJ5eXl5LW1tLWRkXFxcIi4gQ2FuIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXMgZm9yIHRoZSBJbmNvbWUgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgY29ycmVzcG9uZGluZyB0byBhbiBpbmNvbWUgc291cmNlIHNwZWNpZmllZCBieSB0aGUgdXNlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIHBlciBjeWNsZSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X3Blcl9jeWNsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIGFubnVhbGx5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfYW5udWFsPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfdHlwZT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5O1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgYW5kIHRpbWUgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQnkgZGVmYXVsdCwgYSBgbGlua190b2tlbmAgY3JlYXRlZCB0byBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIHRoYXQgd2lsbCBiZSBleGNoYW5nZWQgZm9yIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgNCBob3VycywgYW5kIGEgYGxpbmtfdG9rZW5gIGNyZWF0ZWQgZm9yIGFuIGV4aXN0aW5nIEl0ZW0gKHN1Y2ggYXMgd2hlbiB1cGRhdGluZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYCBieSBsYXVuY2hpbmcgTGluayBpbiB1cGRhdGUgbW9kZSkgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBJZiB1c2luZyBbSG9zdGVkIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pLCB0aGUgYGxpbmtfdG9rZW5gIHdpbGwgZXhwaXJlIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIEhvc3RlZCBMaW5rIFVSTCwgYW5kIHlvdSBjYW4gY3VzdG9taXplIHRoZSBkdXJhdGlvbiB1c2luZyB0aGUgYGhvc3RlZF9saW5rLnVybF9saWZldGltZV9zZWNvbmRzYCBvcHRpb24gaW4gdGhlIHJlcXVlc3QuIElmIHVzaW5nIExpbmsgRGVsaXZlcnkgKGJldGEpLCB0aGUgYGxpbmtfdG9rZW5gIHdpbGwgZXhwaXJlIGJ5IGRlZmF1bHQgYWZ0ZXIgMjQgaG91cnMgaWYgc2VudCB2aWEgU01TIGFuZCBhZnRlciA3IGRheXMgaWYgc2VudCB2aWEgZW1haWwuIElmIHVzaW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgTGluayB0b2tlbiBleHBpcmF0aW9uIHdpbGwgbm90IGJlIGVuZm9yY2VkOyBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gTGluayBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHdpdGggYW4gZXhwaXJlZCBMaW5rIHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCBvZiBhIFBsYWlkLWhvc3RlZCBMaW5rIGZsb3cgdGhhdCB3aWxsIHVzZSB0aGUgTGluayB0b2tlbiByZXR1cm5lZCBieSB0aGlzIHJlcXVlc3QuIE9ubHkgcHJlc2VudCBpZiB0aGUgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciBIb3N0ZWQgTGluay4gVG8gZW5hYmxlIHRoZSBzZXNzaW9uIGZvciBIb3N0ZWQgTGluaywgc2VuZCBhIGBob3N0ZWRfbGlua2Agb2JqZWN0IGluIHRoZSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaG9zdGVkX2xpbmtfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWcge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgb3BlbiBMaW5rIHdpdGhvdXQgYW4gaW5pdGlhbCBVSS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuRVVDb25maWdcbiAgICAgKi9cbiAgICBoZWFkbGVzcz86IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudHMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjdHNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5pdGlhbF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgd2ViaG9va2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY291bnRyeV9jb2Rlc2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIGBsYW5ndWFnZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEZpbHRlcnNSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IEFjY291bnRGaWx0ZXJzUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWRpcmVjdF91cmlgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X25hbWVgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IExpbmsgc2Vzc2lvbnMgY3JlYXRlZCB1c2luZyB0aGlzIGBsaW5rX3Rva2VuYC4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbnM/OiBBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgbGluayBzZXNzaW9uLiBTZXNzaW9uIGRhdGEgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXAgdG8gc2l4IGhvdXJzIGFmdGVyIHRoZSBzZXNzaW9uIGhhcyBlbmRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBsaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmlyc3Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGFydGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmluaXNoZWQsIGlmIGF2YWlsYWJsZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmaW5pc2hlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb25fc3VjY2Vzcz86IExpbmtTZXNzaW9uU3VjY2VzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9uX2V4aXQ/OiBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZXhpdD86IExpbmtTZXNzaW9uRXhpdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBjdXN0b21lci1yZWxhdGVkIExpbmsgZXZlbnRzXG4gICAgICogQHR5cGUge0FycmF5PExpbmtFdmVudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBldmVudHM/OiBBcnJheTxMaW5rRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblJlc3VsdHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXN1bHRzPzogTGlua1Nlc3Npb25SZXN1bHRzIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHNlbGYtY3VzdG9keSBjcnlwdG8gd2FsbGV0cyB0byBiZSBhZGRlZCB3aXRob3V0IHJlcXVpcmluZyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X3VudmVyaWZpZWRfY3J5cHRvX3dhbGxldHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgYWxsb3cgdXNlcnMgdG8gbWFudWFsbHkgZW50ZXIgSW52ZXN0bWVudHMgYWNjb3VudCBhbmQgaG9sZGluZ3MgaW5mb3JtYXRpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWxsb3dfbWFudWFsX2VudHJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgSW52ZXN0bWVudHMgTW92ZSBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aCB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgbWFudWFsIGVudHJ5IGZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIG1hbnVhbF9lbnRyeV9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgbWFza2VkIG51bWJlciBtYXRjaCBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYXNrZWRfbnVtYmVyX21hdGNoX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHNob3cgaW5zdGl0dXRpb25zIHRoYXQgdXNlIHRoZSBzdGF0ZWQgYWNjb3VudCBudW1iZXIgZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgc3RhdGVkX2FjY291bnRfbnVtYmVyX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHRoZSBmZWUgYW5kIGNvbnRyaWJ1dGlvbiBkZXRhaWxzIGZvciA0MDFrIGFjY291bnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIHJvbGxvdmVyXzQwMWtfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5UcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5UcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDkwIGRheXMuIElmIGEgdmFsdWUgdW5kZXIgMzAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAzMCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuIE9uY2UgVHJhbnNhY3Rpb25zIGhhcyBiZWVuIGFkZGVkIHRvIGFuIEl0ZW0sIHRoaXMgdmFsdWUgY2Fubm90IGJlIHVwZGF0ZWQuICBDdXN0b21lcnMgdXNpbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSBzaG91bGQgcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IGZvciBvcHRpbWFsIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdlYmhvb2sgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0dXMgb2YgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIHRvIGEgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS19ERUxJVkVSWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUxJVkVSWV9TVEFUVVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfbWV0YWRhdGE6IExpbmtEZWxpdmVyeU1ldGFkYXRhO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW4ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIExvYW5cbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVJTOiBMb2FuSWRlbnRpZmllcnM7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGxvYW4gYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1sb2FuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExvYW5BY2NvdW50U3VidHlwZSB7XG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ29tbWVyY2lhbCA9ICdjb21tZXJjaWFsJyxcbiAgICBDb25zdHJ1Y3Rpb24gPSAnY29uc3RydWN0aW9uJyxcbiAgICBDb25zdW1lciA9ICdjb25zdW1lcicsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBNb3J0Z2FnZSA9ICdtb3J0Z2FnZScsXG4gICAgTGluZU9mQ3JlZGl0ID0gJ2xpbmUgb2YgY3JlZGl0JyxcbiAgICBTdHVkZW50ID0gJ3N0dWRlbnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBsb2FuYC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5GaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuRmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIFRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbG9hbiBieSB2YXJpb3VzIHBhcnRpZXMgdG8gdGhlIHRyYW5zYWN0aW9uIG9yIG90aGVyIG9yZ2FuaXphdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyXG4gICAgICovXG4gICAgTG9hbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllclR5cGU6IExvYW5JZGVudGlmaWVyVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBsb2FuIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuSWRlbnRpZmllclR5cGUge1xuICAgIExlbmRlckxvYW4gPSAnTGVuZGVyTG9hbicsXG4gICAgVW5pdmVyc2FsTG9hbiA9ICdVbml2ZXJzYWxMb2FuJ1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgY3VycmVudCBhbmQgcHJldmlvdXMgaWRlbnRpZmllcnMgZm9yIHRoaXMgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogTG9hbklkZW50aWZpZXI7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgbG9hbiBwYXltZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuUGF5bWVudHNDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbG9hbiBwYXltZW50cyBtYWRlIGluIHRoZSAzMCBkYXlzIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGRhdGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNDb3VudHNcbiAgICAgKi9cbiAgICBiYXNlbGluZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBsb2FuIHBheW1lbnRzIG1hZGUgaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5QYXltZW50c01lcmNoYW50Q291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXF1ZSBsb2FuIHBheW1lbnQgbWVyY2hhbnRzIGRldGVjdGVkIGluIHRoZSAzMCBkYXlzIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGRhdGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICAgICAqL1xuICAgIGJhc2VsaW5lX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHVuaXF1ZSBsb2FuIHBheW1lbnQgbWVyY2hhbnRzIGRldGVjdGVkIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGxvYW5zIHRoYXQgYXJlIHBhcnQgb2YgYSBzaW5nbGUgZGVhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW59XG4gICAgICogQG1lbWJlcm9mIExvYW5zXG4gICAgICovXG4gICAgTE9BTjogTG9hbjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbGF0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbG9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBkZWZpbmVkIHN0b3JlIG51bWJlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBzdG9yZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbXVsdGktZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzIHRvIHVzZSB3aXRoIHRoaXMgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1GQVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1GQSB7XG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSBgZGV2aWNlYCwgYHNlbGVjdGlvbnNgLCBvciBgcXVlc3Rpb25zYC4gIElmIHZhbHVlIGlzIGBkZXZpY2VgLCB0aGUgTUZBIGFuc3dlciBpcyBgMTIzNGAuICBJZiB2YWx1ZSBpcyBgc2VsZWN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzIGFsd2F5cyB0aGUgZmlyc3Qgb3B0aW9uLiAgSWYgdmFsdWUgaXMgYHF1ZXN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzICBgYW5zd2VyXzxpPl88aj5gIGZvciB0aGUgai10aCBxdWVzdGlvbiBpbiB0aGUgaS10aCByb3VuZCwgc3RhcnRpbmcgZnJvbSAwLiBGb3IgZXhhbXBsZSwgdGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaW4gdGhlIHNlY29uZCByb3VuZCBpcyBgYW5zd2VyXzFfMGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2YgcXVlc3Rpb25zLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBxdWVzdGlvbnMgcGVyIHJvdW5kLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIElmIHZhbHVlIG9mIHR5cGUgaXMgYHNlbGVjdGlvbnNgLCBkZWZhdWx0IHZhbHVlIGlzIDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25zX3Blcl9yb3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2Ygc2VsZWN0aW9ucywgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYXZhaWxhYmxlIGFuc3dlcnMgcGVyIHF1ZXN0aW9uLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uYC4gRGVmYXVsdHMgdG8gMi4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uc19wZXJfcXVlc3Rpb246IG51bWJlcjtcbn1cbi8qKlxuICogU3VtbWFyeSBvYmplY3QgcmVmbGVjdGluZyB0aGUgbWF0Y2ggcmVzdWx0IG9mIHRoZSBhc3NvY2lhdGVkIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgTWF0Y2hTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGEgdXNlcuKAmXMgdG9wIG1lcmNoYW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lcmNoYW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBpZCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIG1lcmNoYW50IG9mIHRoaXMgdHlwZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ByaW1hcnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfZGV0YWlsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogQWxsb3dzIHNwZWNpZnlpbmcgdGhlIG1ldGFkYXRhIG9mIHRoZSB0ZXN0IGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIGxpbWl0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG1hc2suIFNob3VsZCBiZSBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmcgb2YgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGlzIGFsbG93cyB5b3UgdG8gbW9kZWwgYSBtYXNrIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50IG51bWJlciAoc3VjaCBhcyB3aXRoIGEgdmlydHVhbCBhY2NvdW50IG51bWJlcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSByZWFzb24geW91IGFyZSBnZW5lcmF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0IGZvciB0aGlzIHVzZXIuICAgYEFDQ09VTlRfUkVWSUVXX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNvbnN1bWVyIGNyZWRpdCB0cmFuc2FjdGlvbiBmb3IgdGhlIHJldmlldyBvciBjb2xsZWN0aW9uIG9mIGFuIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSYDogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3cml0dGVuIGluc3RydWN0aW9ucyBvZiB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgyKSwgc3VjaCBhcyB3aGVuIGFuIGluZGl2aWR1YWwgYWdyZWVzIHRvIGFjdCBhcyBhIGd1YXJhbnRvciBvciBhc3N1bWVzIHBlcnNvbmFsIGxpYWJpbGl0eSBmb3IgYSBjb25zdW1lciwgYnVzaW5lc3MsIG9yIGNvbW1lcmNpYWwgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSB7XG4gICAgQWNjb3VudFJldmlld0NyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19DUkVESVQnLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvbk90aGVyID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fT1RIRVInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgaW5jb21lIHN1YmNhdGVnb3J5IG9mIHRoZSByZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxNb250aGx5SW5jb21lSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX21vbnRobHlfaW5jb21lOiBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lU291cmNlc0NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZXNfY291bnRzOiBJbmNvbWVTb3VyY2VzQ291bnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGb3JlY2FzdGVkTW9udGhseUluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9tb250aGx5X2luY29tZTogRm9yZWNhc3RlZE1vbnRobHlJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpc3RvcmljYWxBbm51YWxJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYW5udWFsX2luY29tZTogSGlzdG9yaWNhbEFubnVhbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtBcnJheTxNb25pdG9yaW5nSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZXM6IEFycmF5PE1vbml0b3JpbmdJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk6IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBkZXRlY3RlZCB0cmFuc2FjdGlvbiBkYXRlIGZvciB0aGlzIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgbGFzdF90cmFuc2FjdGlvbl9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIE1vbml0b3JpbmcgSW5zaWdodHMgZm9yIHRoZSBnaXZlbiBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lOiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdMb2FuSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvYW5zOiBNb25pdG9yaW5nTG9hbkluc2lnaHRzO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBNb25pdG9yaW5nIEluc2lnaHRzIEl0ZW1cXCdzIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSXRlbVN0YXR1c0NvZGV9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBzdGF0dXNfY29kZTogTW9uaXRvcmluZ0l0ZW1TdGF0dXNDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgcmVhc29uIGZvciB3aHkgYSBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgd2hlbiB0aGUgYHN0YXR1c19jb2RlYCBpcyBub3QgYEFWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzXG4gICAgICovXG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRW51bSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgaW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cyB7XG4gICAgQXZhaWxhYmxlID0gJ0FWQUlMQUJMRScsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCcsXG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBVbnN1cHBvcnRlZCA9ICdVTlNVUFBPUlRFRCcsXG4gICAgVW5oZWFsdGh5ID0gJ1VOSEVBTFRIWSdcbn1cblxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIGV2ZXJ5IGRheSB3aXRoIGluZm9ybWF0aW9uIG9uIHRoZSBzdGF0dXMgb2YgdGhlIHVwZGF0ZS4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9NT05JVE9SSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5TSUdIVFNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gZm9yIHdoeSBpbnNpZ2h0cyBtYXkgbm90IGJlIGBBVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCB0aGF0IHRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRW51bSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbVxcJ3MgaW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdJdGVtU3RhdHVzQ29kZSB7XG4gICAgQXZhaWxhYmxlID0gJ0FWQUlMQUJMRScsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCcsXG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2FuIGV4cG9zdXJlIHN1YmNhdGVnb3J5IG9mIHRoZSByZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdMb2FuSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuUGF5bWVudHNDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX3BheW1lbnRzX2NvdW50czogTG9hblBheW1lbnRzQ291bnRzO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbG9hbiBkaXNidXJzZW1lbnRzIGRldGVjdGVkIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gICAgICovXG4gICAgbG9hbl9kaXNidXJzZW1lbnRzX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5QYXltZW50c01lcmNoYW50Q291bnRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gICAgICovXG4gICAgbG9hbl9wYXltZW50X21lcmNoYW50c19jb3VudHM6IExvYW5QYXltZW50c01lcmNoYW50Q291bnRzO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgaW50ZXJlc3QgcmF0ZSBmb3IgdGhlIG1vcnRnYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlIHtcbiAgICAvKipcbiAgICAgKiBQZXJjZW50YWdlIHZhbHVlIChpbnRlcmVzdCByYXRlIG9mIGN1cnJlbnQgbW9ydGdhZ2UsIG5vdCBBUFIpIG9mIGludGVyZXN0IHBheWFibGUgb24gYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlcmVzdCBjaGFyZ2VkIChmaXhlZCBvciB2YXJpYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgbW9ydGdhZ2UgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBvdXRzdGFuZGluZyBhbW91bnQgY2hhcmdlZCBmb3IgbGF0ZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgY3VycmVudF9sYXRlX2ZlZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgaGVsZCBpbiBlc2Nyb3cgdG8gcGF5IHRheGVzIGFuZCBpbnN1cmFuY2Ugb24gYmVoYWxmIG9mIHRoZSBib3Jyb3dlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGVzY3Jvd19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciBoYXMgcHJpdmF0ZSBtb3J0Z2FnZSBpbnN1cmFuY2UgaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wbWk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciB3aWxsIHBheSBhIHBlbmFsdHkgZm9yIGVhcmx5IHBheW9mZiBvZiBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcHJlcGF5bWVudF9wZW5hbHR5OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VJbnRlcmVzdFJhdGV9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaW50ZXJlc3RfcmF0ZTogTW9ydGdhZ2VJbnRlcmVzdFJhdGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGxvYW4sIGZvciBleGFtcGxlIGBjb252ZW50aW9uYWxgLCBgZml4ZWRgLCBvciBgdmFyaWFibGVgLiBUaGlzIGZpZWxkIGlzIHByb3ZpZGVkIGRpcmVjdGx5IGZyb20gdGhlIGxvYW4gc2VydmljZXIgYW5kIGRvZXMgbm90IGhhdmUgYW4gZW51bWVyYXRlZCBzZXQgb2YgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90eXBlX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZ1bGwgZHVyYXRpb24gb2YgbW9ydGdhZ2UgYXMgYXQgb3JpZ2luYXRpb24gKGUuZy4gYDEwIHllYXJgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdGVybTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPcmlnaW5hbCBkYXRlIG9uIHdoaWNoIG1vcnRnYWdlIGlzIGR1ZSBpbiBmdWxsLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG1hdHVyaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbmV4dCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9tb250aGx5X3BheW1lbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fcHJpbmNpcGFsX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbG9hbiAocHJpbmNpcGFsICsgaW50ZXJlc3QpIHBhc3QgZHVlIGZvciBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcGFzdF9kdWVfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwcm9wZXJ0eV9hZGRyZXNzOiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfaW50ZXJlc3RfcGFpZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgWVREIHByaW5jaXBhbCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX3ByaW5jaXBhbF9wYWlkOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmaWVsZHMgZGVzY3JpYmluZyBwcm9wZXJ0eSBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpdmUgb3IgbmluZSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgKGV4YW1wbGUgXFxcIk5DXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgKGV4YW1wbGUgXFxcIjU2NCBNYWluIFN0cmVldCwgQXB0IDE1XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIHJpc2sgc2lnbmFscyBhbmQgcmVsZXZhbnQgbWV0YWRhdGEgZm9yIGEgc2V0IG9mIHVwbG9hZGVkIGRvY3VtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYXR0cmlidXRlcyB0aGF0IGNvdWxkIGluZGljYXRlIGlmIGEgZG9jdW1lbnQgaXMgZnJhdWR1bGVudFxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZXM6IEFycmF5PFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZT47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYXR0cmlidXRlcyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGZyYXVkIHJpc2sgd2l0aCBhIHNldCBvZiBkb2N1bWVudHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIG5hbWUgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBuYW1lIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgbmFtZS4gMTAwIGlzIGEgcGVyZmVjdCBzY29yZSwgOTktODUgbWVhbnMgYSBzdHJvbmcgbWF0Y2gsIDg0LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55IHNjb3JlIGxlc3MgdGhhbiA3MCBpcyBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIG5hbWUgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGZpcnN0IG9yIGxhc3QgbmFtZSBjb21wbGV0ZWx5IG1hdGNoZWQsIGxpa2VseSBhIGZhbWlseSBtZW1iZXJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19maXJzdF9uYW1lX29yX2xhc3RfbmFtZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIG5pY2tuYW1lIG1hdGNoZWQsIGV4YW1wbGUgSmVubmlmZXIgYW5kIEplbm4uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfbmlja25hbWVfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIG5hbWUgb24gZWl0aGVyIG9mIHRoZSBuYW1lcyB0aGF0IHdhcyBtYXRjaGVkIGZvciB0aGUgc2NvcmUgY29udGFpbmVkIHN0cmluZ3MgaW5kaWNhdGl2ZSBvZiBhIGJ1c2luZXNzIG5hbWUsIHN1Y2ggYXMgXFxcIkNPUlBcXFwiLCBcXFwiTExDXFxcIiwgXFxcIklOQ1xcXCIsIG9yIFxcXCJMVERcXFwiLiBBIGB0cnVlYCByZXN1bHQgZ2VuZXJhbGx5IGluZGljYXRlcyB0aGF0IGFuIGFjY291bnRcXCdzIG5hbWUgaXMgYSBidXNpbmVzcyBuYW1lLiBIb3dldmVyLCBhIGBmYWxzZWAgcmVzdWx0IGRvZXMgbm90IG1lYW4gdGhlIGFjY291bnQgbmFtZSBpcyBub3QgYSBidXNpbmVzcyBuYW1lLCBhcyBzb21lIGJ1c2luZXNzZXMgZG8gbm90IHVzZSB0aGVzZSBzdHJpbmdzIGluIHRoZSBuYW1lcyB1c2VkIGZvciB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfYnVzaW5lc3NfbmFtZV9kZXRlY3RlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0UGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWx9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWw/OiBUb3RhbDtcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgTmV0d29yayBJbnNpZ2h0cyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBJbnNpZ2h0cyByZXBvcnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIE5ldHdvcmsgSW5zaWdodHMgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIG1hcCBvZiBuZXR3b3JrIGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgaXMgYSBmbG9hdCwgaW50LCBvciBib29sZWFuLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIG5ldHdvcmtfYXR0cmlidXRlczogb2JqZWN0O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGFjY2Vzc190b2tlbnMuXG4gICAgICogQHR5cGUge0FycmF5PE5ldHdvcmtJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8TmV0d29ya0luc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbmV0d29ya19pbnNpZ2h0cy9yZXBvcnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjZXNzIHRva2VucyB0aGF0IHRoZSBOZXR3b3JrIEluc2lnaHRzIHdpbGwgYmUgcmVxdWVzdGVkIGZvci4gVGhlc2UgY29ycmVzcG9uZCB0byBwcmV2aW91cyBJdGVtcyBhIHVzZXIgaGFzIGNvbm5lY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9uZXR3b3JrX2luc2lnaHRzL3JlcG9ydC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya0luc2lnaHRzUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogTmV0d29ya0luc2lnaHRzUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbmV0d29yay9zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogTmV0d29ya1N0YXR1c0dldFVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIGEgdGVtcGxhdGUgZGVmaW5lZCBpbiBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZmllbGQgaXMgdXNlZCBpZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIGNyaXRlcmlhIHRoYXQgeW91IHdhbnQgdG8gY2hlY2sgYWdhaW5zdCAoZS5nLiBMYXllciBlbGlnaWJpbGl0eSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9uZXR3b3JrL3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5ldHdvcmtfc3RhdHVzOiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGF5ZXI/OiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBMYXllci1yZWxhdGVkIG1ldGFkYXRhIGZvciB0aGUgcmVxdWVzdGVkIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllclxuICAgICAqL1xuICAgIGVsaWdpYmxlOiBib29sZWFuO1xufVxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgb3ZlcmFsbCBuZXR3b3JrIHN0YXR1cyBvZiB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgUmV0dXJuaW5nVXNlciA9ICdSRVRVUk5JTkdfVVNFUidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgZm9yIHRoZSBuZXR3b3JrIHN0YXR1cyBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0VXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBkZXRlY3RzIGEgbmV3IGFjY291bnQuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IGNhbiBwcm9tcHQgeW91ciB1c2VycyB0byBzaGFyZSBuZXcgYWNjb3VudHMgd2l0aCB5b3UgdGhyb3VnaCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8jdXNpbmctdXBkYXRlLW1vZGUtdG8tcmVxdWVzdC1uZXctYWNjb3VudHMpIChVUy9DQSBvbmx5KS4gSWYgdGhlIGVuZCB1c2VyIGhhcyBvcHRlZCBub3QgdG8gc2hhcmUgbmV3IGFjY291bnRzIHdpdGggUGxhaWQgdmlhIHRoZWlyIGluc3RpdHV0aW9uXFwncyBPQXV0aCBzZXR0aW5ncywgUGxhaWQgd2lsbCBub3QgZGV0ZWN0IG5ldyBhY2NvdW50cyBhbmQgdGhpcyB3ZWJob29rIHdpbGwgbm90IGZpcmUuIEZvciBlbmQgdXNlciBhY2NvdW50cyBpbiB0aGUgRVUgYW5kIFVLLCB1cG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIHlvdSBjYW4gcHJvbXB0IHlvdXIgdXNlciB0byByZS1saW5rIHRoZWlyIGFjY291bnQgYW5kIHRoZW4gZGVsZXRlIHRoZSBvbGQgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWVyIG51bWJlciBkYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFjY291bnQuIEFsbCB2YWx1ZXMgYXJlIG9wdGlvbmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGZvciB0aGUgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByb3V0aW5nIG51bWJlci4gVG8gdGVzdCBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgLCBzZXQgdGhpcyB0byAzMjIyNzE2MjcgdG8gZm9yY2UgYSBgdHJ1ZWAgcmVzdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfcm91dGluZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3dpcmVfcm91dGluZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgaW5zdGl0dXRpb24gbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9icmFuY2hgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfaW5zdGl0dXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGJyYW5jaCBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2luc3RpdHV0aW9uYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2JyYW5jaD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBCYW5rIGlkZW50aWZpZXIgY29kZSAoQklDKS4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2liYW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2JpYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCBudW1iZXIgKElCQU4pLiBJZiBubyBhY2NvdW50IG51bWJlciBpcyBzcGVjaWZpZWQgdmlhIGBhY2NvdW50YCwgd2lsbCBhbHNvIGJlIHVzZWQgYXMgdGhlIGFjY291bnQgbnVtYmVyIGJ5IGRlZmF1bHQuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9iaWNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2liYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQkFDUyBzb3J0IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYmFjc19zb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQUNBVFMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0FUU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0FUUyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXJzIGZvciB0aGUgY2xlYXJpbmdob3VzZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGluIG9yZGVyIG9mIHJlbGV2YW5jZS4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGlmIHdlIGNhblxcJ3QgcHJvdmlkZSBhbnkgYWNjb3VudCBsZXZlbCBkYXRhLiBJbnN0aXR1dGlvbiBsZXZlbCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgaW5zdGl0dXRpb25zL2dldCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGR0Y19udW1iZXJzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0gge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIEF0IGNlcnRhaW4gaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgQ2hhc2UgYW5kIFBOQywgeW91IHdpbGwgcmVjZWl2ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdGhpcyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24gYW5kIG9uIGhvdyB0byBhdm9pZCBmcmF1ZCwgdXNlciBjb25mdXNpb24sIGFuZCBBQ0ggcmV0dXJucywgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgbnVtYmVyIGlzIHRva2VuaXplZCBieSB0aGUgaW5zdGl0dXRpb24uIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdG9rZW5pemVkIGFjY291bnQgbnVtYmVycyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGlzX3Rva2VuaXplZF9hY2NvdW50X251bWJlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBrbm93biB0byB1c2UgYSBzZXBhcmF0ZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBNYW55IGluc3RpdHV0aW9ucyBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHdpcmUgcm91dGluZyBudW1iZXIgYW5kIHVzZSB0aGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB3aXJlcyBpbnN0ZWFkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBoYXZlIHRoZSBlbmQgdXNlciBtYW51YWxseSBjb25maXJtIHRoZWlyIHdpcmUgcm91dGluZyBudW1iZXIgYmVmb3JlIHNlbmRpbmcgYW55IHdpcmVzIHRvIHRoZWlyIGFjY291bnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBmaWVsZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIEF0IGNlcnRhaW4gaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgQ2hhc2UgYW5kIFBOQywgeW91IHdpbGwgcmVjZWl2ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdGhpcyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24gYW5kIG9uIGhvdyB0byBhdm9pZCBmcmF1ZCwgdXNlciBjb25mdXNpb24sIGFuZCBBQ0ggcmV0dXJucywgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBudW1iZXIgaXMgdG9rZW5pemVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBpc190b2tlbml6ZWRfYWNjb3VudF9udW1iZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBrbm93biB0byB1c2UgYSBzZXBhcmF0ZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBNYW55IGluc3RpdHV0aW9ucyBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHdpcmUgcm91dGluZyBudW1iZXIgYW5kIHVzZSB0aGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB3aXJlcyBpbnN0ZWFkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBoYXZlIHRoZSBlbmQgdXNlciBtYW51YWxseSBjb25maXJtIHRoZWlyIHdpcmUgcm91dGluZyBudW1iZXIgYmVmb3JlIHNlbmRpbmcgYW55IHdpcmVzIHRvIHRoZWlyIGFjY291bnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBmaWVsZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBpbnRvIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9pbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBvdXQgb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQgdmlhIEFUT04uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBVE9OXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FUT04ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FUT05cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FUT05cbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQkFDUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCQUNTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzRUZUIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIENhbmFkaWFuIGJhbmsgYWNjb3VudCB2aWEgRUZULlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGJyYW5jaDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSUJBTk51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0lCQU5OdWxsYWJsZSB7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhbiBpbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCB2aWEgd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFuayBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBudW1iZXJzIHVzaW5nIHRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgYW5kIEJJQy9TV0lGVCBjb2RlIGZvcm1hdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQnVzaW5lc3MgSWRlbnRpZmllciBDb2RlLCBhbHNvIGtub3duIGFzIFNXSUZUIGNvZGUsIGZvciB0aGlzIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyBmcm9tIGEgNDAxayBhY2NvdW50IHRvIGFub3RoZXIgNDAxayBhY2NvdW50IG9yIElSQSB2aWEgdGhlIG1hbnVhbCA0MDFrIHJvbGxvdmVyIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNSZXRpcmVtZW50NDAxa1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNSZXRpcmVtZW50NDAxayB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzUmV0aXJlbWVudDQwMWtcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYW4gbnVtYmVyIGZvciB0aGUgZW1wbG95ZXJcXCdzIDQwMWsgcmV0aXJlbWVudCBwbGFuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1JldGlyZW1lbnQ0MDFrXG4gICAgICovXG4gICAgcGxhbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzUmV0aXJlbWVudDQwMWtcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVmFsaWQgdmFsdWVzIGFyZSBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPbWl0dGFibGVUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIG9wdGlvbiBzZWN1cml0eS4gIEZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBkYXRhIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgaXRlbSBpcyB1c2luZyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdCwgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGZ1bmRzLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGJ5IGxvY2FsIHJlZ3VsYXRpb24gZm9yIGNlcnRhaW4gYnVzaW5lc3NlcyAoZS5nLiBtb25leSByZW1pdHRhbmNlKSB0byBzZW5kIHBheW91dHMgdG8gcmVjaXBpZW50cyBpbiB0aGUgRVUgYW5kIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdGhlIGZ1bmRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGZ1bGxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIGZyb20gd2hpY2ggdGhlIGZ1bmRzIGFyZSBzb3VyY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSwgYWxzbyBrbm93biBhcyBTV0lGVCBjb2RlLCBmb3IgdGhpcyBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRpbmdGdW5kU291cmNlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyAgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgZm9yY2VfYXZhaWxhYmxlX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVPdmVycmlkZTtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gQW55IGZpZWxkcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZGVmYXVsdCBTYW5kYm94IGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lck92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBuYW1lcyBvZiBpbmRpdmlkdWFscywgZXZlbiBmb3IgYnVzaW5lc3MgYWNjb3VudHMuIE5vdGUgdGhhdCB0aGUgc2FtZSBuYW1lIGRhdGEgd2lsbCBiZSB1c2VkIGZvciBhbGwgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PFBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxFbWFpbD47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgdmFyaW91cyBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz47XG59XG4vKipcbiAqIEhvdyBhbiBhc3NldCBpcyBvd25lZC4gIGBhc3NvY2lhdGlvbmA6IE93bmVyc2hpcCBieSBhIGNvcnBvcmF0aW9uLCBwYXJ0bmVyc2hpcCwgb3IgdW5pbmNvcnBvcmF0ZWQgYXNzb2NpYXRpb24sIGluY2x1ZGluZyBmb3ItcHJvZml0IGFuZCBub3QtZm9yLXByb2ZpdCBvcmdhbml6YXRpb25zLiBgaW5kaXZpZHVhbGA6IE93bmVyc2hpcCBieSBhbiBpbmRpdmlkdWFsLiBgam9pbnRgOiBKb2ludCBvd25lcnNoaXAgYnkgbXVsdGlwbGUgcGFydGllcy4gYHRydXN0YDogT3duZXJzaGlwIGJ5IGEgcmV2b2NhYmxlIG9yIGlycmV2b2NhYmxlIHRydXN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3duZXJzaGlwVHlwZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBJbmRpdmlkdWFsID0gJ2luZGl2aWR1YWwnLFxuICAgIEpvaW50ID0gJ2pvaW50JyxcbiAgICBBc3NvY2lhdGlvbiA9ICdhc3NvY2lhdGlvbicsXG4gICAgVHJ1c3QgPSAndHJ1c3QnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYSBwb3N0IG9mZmljZSBib3guIFdpbGwgYmUgYHllc2Agd2hlbiBhIFAuTy4gYm94IGlzIGRldGVjdGVkLCBgbm9gIHdoZW4gUGxhaWQgY29uZmlybWVkIHRoZSBhZGRyZXNzIGlzIG5vdCBhIFAuTy4gYm94LCBhbmQgYG5vX2RhdGFgIHdoZW4gUGxhaWQgd2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBhIFAuTy4gYm94LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUE9Cb3hTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgc3R1ZGVudFxcJ3MgZWxpZ2liaWxpdHkgaW4gdGhlIFB1YmxpYyBTZXJ2aWNlIExvYW4gRm9yZ2l2ZW5lc3MgcHJvZ3JhbS4gVGhpcyBpcyBvbmx5IHJldHVybmVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBGZWRMb2FuIChgaW5zXzExNjUyN2ApLiBTaW5jZSBGZWRMb2FuIG5vIGxvbmdlciBzZXJ2aWNlcyBzdHVkZW50IGxvYW5zLCB0aGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXR1cm5lZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PFBhcnR5Pjtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuIFRoZSBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgdW5pcXVlIGFuZCBjYW5ub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVjaG5pY2FsX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJpbGxpbmdfY29udGFjdD86IFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfc3VwcG9ydF9pbmZvPzogUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mbztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSBwYXJ0bmVyIGhhcyBmb3J3YXJkZWQgdGhlIFBsYWlkIGJhbmsgYWRkZW5kdW0gdG8gdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2JhbmtfYWRkZW5kdW1fY29tcGxldGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldHNfdW5kZXJfbWFuYWdlbWVudD86IFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgVVJJcyBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbihzKSB3aGVyZSBhIHVzZXIgY2FuIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gVG8gbW9kaWZ5IHJlZGlyZWN0IFVSSXMgZm9yIGFuIGVuZCBjdXN0b21lciBhZnRlciBjcmVhdGluZyB0aGVtLCBnbyB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBbQVBJIHBhZ2VdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBieSByZWd1bGF0b3J5IGF1dGhvcml0aWVzLCBpZiBhcHBsaWNhYmxlLiBGb3IgYmFua3MsIHRoaXMgaXMgdGhlIEZESUMgQ2VydGlmaWNhdGUgTnVtYmVyLiBGb3IgY3JlZGl0IHVuaW9ucywgdGhpcyBpcyB0aGUgQ3JlZGl0IFVuaW9uIENoYXJ0ZXIgTnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpc3RyYXRpb25fbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmxvd2Rvd25fc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBxdWVzdGlvbm5haXJlX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIGluc3RpdHV0aW9ucyB3aXRoIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJlZ2lzdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgYW4gZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRzIHVuZGVyIG1hbmFnZW1lbnQgZm9yIHRoZSBnaXZlbiBlbmQgY3VzdG9tZXIuIFJlcXVpcmVkIGZvciBlbmQgY3VzdG9tZXJzIHdpdGggbW9udGhseSBzZXJ2aWNlIGNvbW1pdG1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBiaWxsaW5nIGNvbnRhY3QgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGJpbGxpbmcgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHB1YmxpYy4gVXNlcnMgb2YgeW91ciBhcHAgd2lsbCBzZWUgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIG1hbmFnaW5nIGNvbm5lY3Rpb25zIGJldHdlZW4geW91ciBhcHAgYW5kIHRoZWlyIGJhbmsgYWNjb3VudHMgaW4gUGxhaWQgUG9ydGFsLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyBjdXN0b21lciBzdXBwb3J0IGluZm8gaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm8ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBjb250YWN0X3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgbGlua191cGRhdGVfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBhZGRlbmR1bSB0byB0aGUgUGxhaWQgTVNBIChcXFwiZmxvd2Rvd25cXFwiKSBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBJblJldmlldyA9ICdJTl9SRVZJRVcnLFxuICAgIE5lZ290aWF0aW9uID0gJ05FR09USUFUSU9OJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgT0F1dGggcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGVudmlyb25tZW50cz86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHM7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24gd2FzIGFwcHJvdmVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZWlyIGFwcGxpY2F0aW9uIGhhcyBub3QgeWV0IGJlZW4gYXBwcm92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3Rpb25fZW5hYmxlbWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCBub24tT0F1dGggSXRlbSBhZGRzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBmb3IgdGhpcyBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggZGF0ZSBoYXMgYmVlbiBzZXQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjbGFzc2ljX2Rpc2FibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cmF0aW9uIHN0YXR1cyBmb3IgdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIEVuYWJsZWQgPSAnRU5BQkxFRCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnQVRURU5USU9OX1JFUVVJUkVEJ1xufVxuXG4vKipcbiAqIFJlZ2lzdHJhdGlvbiBzdGF0dXNlcyBieSBlbnZpcm9ubWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogVGhlIE9BdXRoIHN0YXR1cyBvZiB0aGUgdXBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnbm90LXN0YXJ0ZWQnLFxuICAgIFByb2Nlc3NpbmcgPSAncHJvY2Vzc2luZycsXG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIEVuYWJsZWQgPSAnZW5hYmxlZCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnYXR0ZW50aW9uLXJlcXVpcmVkJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIG9mIHR5cGUgYFBBUlRORVJgIGFuZCBjb2RlIGBFTkRfQ1VTVE9NRVJfT0FVVEhfU1RBVFVTX1VQREFURURgIHdpbGwgYmUgZmlyZWQgd2hlbiBhIHBhcnRuZXJcXCdzIGVuZCBjdXN0b21lciBoYXMgYW4gdXBkYXRlIG9uIHRoZWlyIE9BdXRoIHJlZ2lzdHJhdGlvbiBzdGF0dXMgd2l0aCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjdXJpdHkgcXVlc3Rpb25uYWlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFJlY2VpdmVkID0gJ1JFQ0VJVkVEJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0cyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIHNhbmRib3g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LiBUaGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGhlIGVuZCBjdXN0b21lciB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBsaW1pdGVkIG51bWJlciBvZiBjcmVkaXRzIHRvIHRlc3QgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYmVmb3JlIGZ1bGwgZW5hYmxlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZW5kIGN1c3RvbWVyLiAgYFVOREVSX1JFVklFV2A6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24uIFRoZSBlbmQgY3VzdG9tZXIgbXVzdCBiZSBtYW51YWxseSByZXZpZXdlZCBieSB0aGUgUGxhaWQgdGVhbSBiZWZvcmUgaXQgY2FuIGJlIGVuYWJsZWQgaW4gZnVsbCBwcm9kdWN0aW9uLCBhdCB3aGljaCBwb2ludCBpdHMgc3RhdHVzIHdpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0aW9uIHRvIGBQRU5ESU5HX0VOQUJMRU1FTlRgIG9yIGBERU5JRURgLiAgYFBFTkRJTkdfRU5BQkxFTUVOVGA6IFRoZSBlbmQgY3VzdG9tZXIgaXMgcmVhZHkgdG8gYmUgZnVsbHkgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gQ2FsbCB0aGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgdG8gZW5hYmxlIHRoZSBlbmQgY3VzdG9tZXIgaW4gZnVsbCBQcm9kdWN0aW9uLiAgYEFDVElWRWA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gZnVsbHkgZW5hYmxlZCBpbiBhbGwgZW52aXJvbm1lbnRzLiAgYERFTklFRGA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24sIGJ1dCBpdCBkaWQgbm90IHBhc3MgcmV2aWV3IGJ5IHRoZSBQbGFpZCB0ZWFtIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGVuYWJsZWQgZm9yIGZ1bGwgUHJvZHVjdGlvbiBhY2Nlc3MuIFRhbGsgdG8geW91ciBBY2NvdW50IE1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXMge1xuICAgIFVuZGVyUmV2aWV3ID0gJ1VOREVSX1JFVklFVycsXG4gICAgUGVuZGluZ0VuYWJsZW1lbnQgPSAnUEVORElOR19FTkFCTEVNRU5UJyxcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBEZW5pZWQgPSAnREVOSUVEJ1xufVxuXG4vKipcbiAqIFRoZSB0ZWNobmljYWwgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgdGVjaG5pY2FsIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBhcnR5IHRvIGEgdHJhbnNhY3Rpb24uIEluY2x1ZGVkIGRpcmVjdCBwYXJ0aWNpcGFudHMgbGlrZSB0aGUgYm9ycm93ZXIgYW5kIHNlbGxlciBhcyB3ZWxsIGFzIGluZGlyZWN0IHBhcnRpY2lwYW50cyBzdWNoIGFzIHRoZSBmbG9vZCBjZXJ0aWZpY2F0ZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5SW5kaXZpZHVhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFJPTEVTOiBSb2xlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogSW5kaXZpZHVhbE5hbWU7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uQSB2YWx1ZSBmcm9tIGEgTUlTTU8gZGVmaW5lZCBsaXN0IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9sZSB0aGF0IHRoZSBwYXJ0eSBwbGF5cyBpbiB0aGUgdHJhbnNhY3Rpb24uIFBhcnRpZXMgbWF5IGJlIGVpdGhlciBhIHBlcnNvbiBvciBsZWdhbCBlbnRpdHkuIEEgcGFydHkgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMgaW4gYSB0cmFuc2FjdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnR5Um9sZVR5cGUge1xuICAgIEJvcnJvd2VyID0gJ0JvcnJvd2VyJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtb25ldGFyeSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgLyoqXG4gICAgICogQSBudW1lcmljYWwgYW1vdW50IG9mIGEgc3BlY2lmaWMgY3VycmVuY3kuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW5jeSBjb2RlLCBlLmcuIFVTRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5VmFsdWV9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZhbHVlOiBQYXlGcmVxdWVuY3lWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlGcmVxdWVuY3lWYWx1ZSB7XG4gICAgTW9udGhseSA9ICdtb250aGx5JyxcbiAgICBTZW1pbW9udGhseSA9ICdzZW1pbW9udGhseScsXG4gICAgV2Vla2x5ID0gJ3dlZWtseScsXG4gICAgQml3ZWVrbHkgPSAnYml3ZWVrbHknLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlfZGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBzdGFydCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB7XG4gICAgUGF5RnJlcXVlbmN5VW5rbm93biA9ICdQQVlfRlJFUVVFTkNZX1VOS05PV04nLFxuICAgIFBheUZyZXF1ZW5jeVdlZWtseSA9ICdQQVlfRlJFUVVFTkNZX1dFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5Qml3ZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9CSVdFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5U2VtaW1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9TRU1JTU9OVEhMWScsXG4gICAgUGF5RnJlcXVlbmN5TW9udGhseSA9ICdQQVlfRlJFUVVFTkNZX01PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd246IEFycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgcGVyaW9kIGVuZGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5nczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgc3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2Jhc2lzPzogQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBzdGFydGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcGF5bWVudC4gRm9yIHN0YW5kaW5nIG9yZGVycyBhbmQgcGF5bWVudCBjb25zZW50cywgYFxcXCJHQlBcXFwiYCBtdXN0IGJlIHVzZWQuIEZvciBQb2xhbmQsIERlbm1hcmssIFN3ZWRlbiBhbmQgTm9yd2F5LCBvbmx5IHRoZSBsb2NhbCBjdXJyZW5jeSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5IHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJyxcbiAgICBQbG4gPSAnUExOJyxcbiAgICBTZWsgPSAnU0VLJyxcbiAgICBEa2sgPSAnREtLJyxcbiAgICBOb2sgPSAnTk9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q2hhbm5lbCB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogTWF4aW11bSBhbW91bnQgb2YgYSBzaW5nbGUgcGF5bWVudCBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBXaGVyZSB0aGUgcGF5bWVudCBjb25zZW50IHBlcmlvZCBzaG91bGQgc3RhcnQuICBJZiB0aGUgaW5zdGl0dXRpb24gaXMgTW9uem8sIG9ubHkgYENPTlNFTlRgIGFsaWdubWVudHMgYXJlIHN1cHBvcnRlZC4gIGBDQUxFTkRBUmA6IGxpbmUgdXAgd2l0aCBhIGNhbGVuZGFyLiAgYENPTlNFTlRgOiBvbiB0aGUgZGF0ZSBvZiBjb25zZW50IGNyZWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0FsaWdubWVudCB7XG4gICAgQ2FsZW5kYXIgPSAnQ0FMRU5EQVInLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGNvbnNlbnQgcGF5bWVudHMgbGltaXRhdGlvbnMgcGVyIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHBlcmlvZGljIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsIHtcbiAgICBEYXkgPSAnREFZJyxcbiAgICBXZWVrID0gJ1dFRUsnLFxuICAgIE1vbnRoID0gJ01PTlRIJyxcbiAgICBZZWFyID0gJ1lFQVInXG59XG5cbi8qKlxuICogTGlmZSBzcGFuIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBBZnRlciB0aGUgYHRvYCBkYXRlIHRoZSBwYXltZW50IGNvbnNlbnQgZXhwaXJlcyBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGZvciBwYXltZW50IGluaXRpYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgZnJvbSB3aGljaCB0aGUgY29uc2VudCBzaG91bGQgYmUgYWN0aXZlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgZnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIGNvbnNlbnQgZXhwaXJlcywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIHRvPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50XFwncyBiYW5rIGFjY291bnQuIFJlcXVpcmVkIGJ5IG1vc3QgaW5zdGl0dXRpb25zIG91dHNpZGUgb2YgdGhlIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCB1c2UgdGhlIFxcJ3R5cGVcXCcgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogTGltaXRhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gcGF5bWVudHMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgdmFsaWRfZGF0ZV90aW1lPzogUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIG1heF9wYXltZW50X2Ftb3VudDogUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbW91bnQgbGltaXRhdGlvbnMgcGVyIHBlcmlvZCBvZiB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICBwZXJpb2RpY19hbW91bnRzOiBBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pjtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuIFRoZSBjcmVhdGVkIGNvbnNlbnQgY2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgZnVuZHMgdG8gdGhpcyByZWNpcGllbnQgb25seS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge1NldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IFNldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlPzogUGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQsIHVzZSB0aGUgXFwndHlwZVxcJyBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzY29wZXM/OiBBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5ZXJfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGF5bWVudCBjb25zZW50IHBheWVyIGRldGFpbHMuICBQYXllciBgbmFtZWAgYW5kIGFjY291bnQgYG51bWJlcnNgIGFyZSByZXF1aXJlZCB0byBsb2NrIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBjb25zZW50IGNhbiBiZSBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXllciBhcyBpdCBhcHBlYXJzIGluIHRoZWlyIGJhbmsgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBiaXJ0aGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBwaG9uZSBudW1iZXJzIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfVxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0lCQU5OdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzXG4gICAgICovXG4gICAgaWJhbj86IE51bWJlcnNJQkFOTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgY29uc2VudCBwYXltZW50LiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIGNvbnNlbnQgcGF5bWVudCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBwYXltZW50IGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHBheW1lbnQgdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gNDggaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSWYgbm90IHByb3ZpZGVkLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIHRvIHRoZSByZWZlcmVuY2UgZnJvbSBjb25zZW50LiBJbiBvcmRlciB0byB0cmFjayBzZXR0bGVtZW50IHZpYSBQYXltZW50IENvbmZpcm1hdGlvbiwgZWFjaCBwYXltZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSByZWZlcmVuY2UuIElmIHRoZSByZWZlcmVuY2UgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQVBJIGlzIG5vdCB1bmlxdWUsIFBsYWlkIHdpbGwgYWRqdXN0IGl0LiBTb21lIGluc3RpdHV0aW9ucyBtYXkgbGltaXQgdGhlIHJlZmVyZW5jZSB0byBsZXNzIHRoYW4gMTggY2hhcmFjdGVycy4gSWYgbmVjZXNzYXJ5LCBQbGFpZCB3aWxsIGFkanVzdCB0aGUgcmVmZXJlbmNlIGJ5IHRydW5jYXRpbmcgaXQgdG8gZml0IHRoZSBpbnN0aXR1dGlvblxcJ3MgcmVxdWlyZW1lbnRzLiBCb3RoIHRoZSBvcmlnaW5hbGx5IHByb3ZpZGVkIGFuZCBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHJlZmVyZW5jZXMgKGlmIGFueSkgY2FuIGJlIGZvdW5kIGluIHRoZSBgcmVmZXJlbmNlYCBhbmQgYGFkanVzdGVkX3JlZmVyZW5jZWAgZmllbGRzLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUgJiBzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZSAmIHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UHJvY2Vzc2luZ01vZGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NpbmdfbW9kZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWNpZGVzIHRoZSBtb2RlIHVuZGVyIHdoaWNoIHRoZSBwYXltZW50IHByb2Nlc3Npbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCwgdXNpbmcgYElNTUVESUFURWAgYXMgZGVmYXVsdC4gIGBJTU1FRElBVEVgOiBXaWxsIGltbWVkaWF0ZWx5IGV4ZWN1dGUgdGhlIHBheW1lbnQsIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVNQU1AgYmVmb3JlIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwYXltZW50IGluaXRpYXRpb24uIFRoaXMgaXMgaWRlYWwgZm9yIHVzZXItcHJlc2VudCBmbG93cy4gICBgQVNZTkNgOiBXaWxsIGFjY2VwdCBhIHBheW1lbnQgZXhlY3V0aW9uIHJlcXVlc3QgYW5kIHNjaGVkdWxlIGl0IGZvciBwcm9jZXNzaW5nLCBpbW1lZGlhdGVseSByZXR1cm5pbmcgdGhlIG5ldyBgcGF5bWVudF9pZGAuIExpc3RlbiBmb3Igd2ViaG9va3Mgb3IgdXNlIHRoZSBbYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbnBheW1lbnRnZXQpIGVuZHBvaW50IHRvIG9idGFpbiB1cGRhdGVzIG9uIHRoZSBwYXltZW50IHN0YXR1cy4gVGhpcyBpcyBpZGVhbCBmb3Igbm9uIHVzZXItcHJlc2VudCBmbG93cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlIHtcbiAgICBBc3luYyA9ICdBU1lOQycsXG4gICAgSW1tZWRpYXRlID0gJ0lNTUVESUFURSdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgY29uc2VudCBgdHlwZWAgZmllbGQuIENvbnNlbnRzIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgc2luZ2xlIHR5cGUuICAgUGF5bWVudCBjb25zZW50IHNjb3BlLiBEZWZpbmVzIHBvc3NpYmxlIGRpcmVjdGlvbnMgZm9yIHBheW1lbnRzIG1hZGUgd2l0aCB0aGUgZ2l2ZW4gY29uc2VudC4gIGBNRV9UT19NRWA6IEFsbG93cyBtb3ZpbmcgbW9uZXkgYmV0d2VlbiBhY2NvdW50cyBvd25lZCBieSB0aGUgc2FtZSB1c2VyLiAgYEVYVEVSTkFMYDogQWxsb3dzIGluaXRpYXRpbmcgcGF5bWVudHMgZnJvbSB0aGUgdXNlclxcJ3MgYWNjb3VudCB0byB0aGlyZCBwYXJ0aWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUge1xuICAgIE1lVG9NZSA9ICdNRV9UT19NRScsXG4gICAgRXh0ZXJuYWwgPSAnRVhURVJOQUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudCBjb25zZW50LiAgYFVOQVVUSE9SSVNFRGA6IENvbnNlbnQgY3JlYXRlZCwgYnV0IHJlcXVpcmVzIHVzZXIgYXV0aG9yaXNhdGlvbi4gIGBSRUpFQ1RFRGA6IENvbnNlbnQgYXV0aG9yaXNhdGlvbiB3YXMgcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYW5kL29yIHRoZSBiYW5rLiAgYEFVVEhPUklTRURgOiBDb25zZW50IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gIGBSRVZPS0VEYDogQ29uc2VudCBoYXMgYmVlbiByZXZva2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICBgRVhQSVJFRGA6IENvbnNlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzIHtcbiAgICBVbmF1dGhvcmlzZWQgPSAnVU5BVVRIT1JJU0VEJyxcbiAgICBBdXRob3Jpc2VkID0gJ0FVVEhPUklTRUQnLFxuICAgIFJldm9rZWQgPSAnUkVWT0tFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUkVKRUNURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ09OU0VOVF9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCBmb3IgdGhlIGNvbnNlbnQgYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgdHlwZS4gRGVmaW5lcyBwb3NzaWJsZSB1c2UgY2FzZSBmb3IgcGF5bWVudHMgbWFkZSB3aXRoIHRoZSBnaXZlbiBjb25zZW50LiAgYFNXRUVQSU5HYDogQWxsb3dzIG1vdmluZyBtb25leSBiZXR3ZWVuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIuICBgQ09NTUVSQ0lBTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGUge1xuICAgIFN3ZWVwaW5nID0gJ1NXRUVQSU5HJyxcbiAgICBDb21tZXJjaWFsID0gJ0NPTU1FUkNJQUwnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIFNFUEEgSW5zdGFudCBwYXltZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3NlcGFfaW5zdGFudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudCBjb25zZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3BheW1lbnRfY29uc2VudHM6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB1c2VkIHRvIHJlc3RyaWN0IHRoZSBhY2NvdW50cyB1c2VkIGZvciBwYXltZW50cy4gSWYgcHJvdmlkZWQsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50UmVmdW5kZWR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgUGxhaWQgdG8gZWFjaCBwYXltZW50IGZvciB0cmFja2luZyBhbmQgcmVjb25jaWxsaWF0aW9uIHB1cnBvc2VzLiAgTm90ZTogTm90IGFsbCBiYW5rcyBoYW5kbGUgZW5kX3RvX2VuZF9pZCBjb25zaXN0ZW50bHkuIFRvIGVuc3VyZSBhY2N1cmF0ZSBtYXRjaGluZywgY2xpZW50cyBzaG91bGQgY29udmVydCBib3RoIHRoZSBpbmNvbWluZyBlbmRfdG9fZW5kX2lkIGFuZCB0aGUgb25lIHByb3ZpZGVkIGJ5IFBsYWlkIHRvIHRoZSBzYW1lIGNhc2UgKGVpdGhlciBsb3dlciBvciB1cHBlcikgYmVmb3JlIGNvbXBhcmlzb24uIEZvciB2aXJ0dWFsIGFjY291bnQgcGF5bWVudHMsIFBsYWlkIG1hbmFnZXMgdGhpcyBmaWVsZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGVuZF90b19lbmRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZvciBhIHBheW1lbnQgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCwgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgdmFsdWU6ICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhlIGluaXRpYWwgcGhhc2Ugb2YgdGhlIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cyB7XG4gICAgUGF5bWVudFN0YXR1c0lucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlZnVuZCBJRHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIGJ5IFBsYWlkIHRvIGVhY2ggcGF5bWVudCBmb3IgdHJhY2tpbmcgYW5kIHJlY29uY2lsbGlhdGlvbiBwdXJwb3Nlcy4gIE5vdGU6IE5vdCBhbGwgYmFua3MgaGFuZGxlIGVuZF90b19lbmRfaWQgY29uc2lzdGVudGx5LiBUbyBlbnN1cmUgYWNjdXJhdGUgbWF0Y2hpbmcsIGNsaWVudHMgc2hvdWxkIGNvbnZlcnQgYm90aCB0aGUgaW5jb21pbmcgZW5kX3RvX2VuZF9pZCBhbmQgdGhlIG9uZSBwcm92aWRlZCBieSBQbGFpZCB0byB0aGUgc2FtZSBjYXNlIChlaXRoZXIgbG93ZXIgb3IgdXBwZXIpIGJlZm9yZSBjb21wYXJpc29uLiBGb3IgdmlydHVhbCBhY2NvdW50IHBheW1lbnRzLCBQbGFpZCBtYW5hZ2VzIHRoaXMgZmllbGQgYXV0b21hdGljYWxseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF90b19lbmRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW1lbnRzIHRvIHJldHVybi4gSWYgYGNvdW50YCBpcyBub3Qgc3BlY2lmaWVkLCBhIG1heGltdW0gb2YgMTAgcGF5bWVudHMgd2lsbCBiZSByZXR1cm5lZCwgYmVnaW5uaW5nIHdpdGggdGhlIG1vc3QgcmVjZW50IHBheW1lbnQgYmVmb3JlIHRoZSBjdXJzb3IgKGlmIHNwZWNpZmllZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIFxcXCIyMDE5LTEyLTA2VDIyOjM1OjQ5WlxcXCIpLiBPbmx5IHBheW1lbnRzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjdXJzb3Igd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuIElmIHNwZWNpZmllZCwgb25seSBwYXltZW50cywgZXhlY3V0ZWQgdXNpbmcgdGhpcyBjb25zZW50LCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfaWRgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhhdCwgd2hlbiB1c2VkIGFzIHRoZSBvcHRpb25hbCBgY3Vyc29yYCBwYXJhbWV0ZXIgdG8gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCwgd2lsbCByZXR1cm4gdGhlIG5leHQgdW5yZXR1cm5lZCBwYXltZW50IGFzIGl0cyBmaXJzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudCB0byByZXZlcnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSByZWZ1bmQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRUb1JlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBQYXltZW50QW1vdW50VG9SZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2RhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2FkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3BheW1lbnQvcmV2ZXJzZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVmdW5kXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHBheW1lbnQuICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhbGwgcGF5bWVudHMuIEl0IGluZGljYXRlcyB0aGF0IHRoZSBwYXltZW50IGlzIHdhaXRpbmcgb24gdXNlciBpbnB1dCB0byBjb250aW51ZSBwcm9jZXNzaW5nLiBBIHBheW1lbnQgbWF5IHJlLWVudGVyIHRoaXMgc3RhdGUgbGF0ZXIgb24gaWYgZnVydGhlciBpbnB1dCBpcyBuZWVkZWQuICBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhvcmlzZWQgYW5kIGFjY2VwdGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBzdWNjZXNzZnVsIHBheW1lbnRzLCB0aGlzIGlzIGEgcG90ZW50aWFsIHRlcm1pbmFsIHN0YXR1cy4gRnVydGhlciBzdGF0dXMgdHJhbnNpdGlvbnMgY2FuIGJlIHRvIFJFSkVDVEVEIGFuZCwgd2hlbiBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLCB0byBFWEVDVVRFRC4gIGBQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFNgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCB0byBiZSBpbml0aWF0ZWQuIFRoaXMgZXJyb3IgbWF5IGJlIGNhdXNlZCBieSB0cmFuc2llbnQgc3lzdGVtIG91dGFnZXMgYW5kIGlzIHJldHJ5YWJsZSBvbmNlIHRoZSByb290IGNhdXNlIGlzIHJlc29sdmVkLiAgYFBBWU1FTlRfU1RBVFVTX0JMT0NLRURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBibG9ja2VkIGJ5IFBsYWlkLiBUaGlzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIGR1ZSB0byBQbGFpZCBmbGFnZ2luZyB0aGUgcGF5bWVudCBhcyBwb3RlbnRpYWxseSByaXNreS4gVGhpcyBpcyBhIHJldHJ5YWJsZSBlcnJvci4gIGBQQVlNRU5UX1NUQVRVU19BVVRIT1JJU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGhhcyBhdXRob3Jpc2VkIHRoZSB0cmFuc2FjdGlvbi4gIGBQQVlNRU5UX1NUQVRVU19DQU5DRUxMRURgOiBUaGUgcGF5bWVudCB3YXMgY2FuY2VsbGVkICh0eXBpY2FsbHkgYnkgdGhlIGVuZCB1c2VyKSBkdXJpbmcgYXV0aG9yaXNhdGlvbi4gIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGA6IFRoZSBmdW5kcyBoYXZlIHN1Y2Nlc3NmdWxseSBsZWZ0IHRoZSBwYXllciBhY2NvdW50IGFuZCBwYXltZW50IGlzIGNvbnNpZGVyZWQgY29tcGxldGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhpcyBzdGF0dXM6IHN1cHBvcnQgaXMgbW9yZSBjb21tb24gaW4gdGhlIFVLLCBhbmQgbGVzcyBjb21tb24gaW4gdGhlIEVVLiBGb3IgaW5zdGl0dXRpb25zIHdoZXJlIHRoaXMgc3RhdHVzIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSB0ZXJtaW5hbCBzdGF0dXMgZm9yIGEgc3VjY2Vzc2Z1bCBwYXltZW50IHdpbGwgYmUgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGAuICBgUEFZTUVOVF9TVEFUVVNfU0VUVExFRGA6IFRoZSBwYXltZW50IGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIEEgcGF5bWVudCB3aWxsIHR5cGljYWxseSBzZXR0bGUgd2l0aGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gd2hpY2ggcGF5bWVudCByYWlsIGlzIHVzZWQuIFRoaXMgc3RhdHVzIGlzIG9ubHkgYXZhaWxhYmxlIHRvIGN1c3RvbWVycyB1c2luZyBbUGxhaWQgVmlydHVhbCBBY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy92aXJ0dWFsLWFjY291bnRzLykuICBgUEFZTUVOVF9TVEFUVVNfRVNUQUJMSVNIRURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLiAgYFBBWU1FTlRfU1RBVFVTX1JFSkVDVEVEYDogVGhlIHBheW1lbnQgd2FzIHJlamVjdGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBEZXByZWNhdGVkOiBUaGVzZSBzdGF0dXNlcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gIGBQQVlNRU5UX1NUQVRVU19VTktOT1dOYDogVGhlIHBheW1lbnQgc3RhdHVzIGlzIHVua25vd24uICBgUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRGA6IEluZGljYXRlcyB0aGF0IHRoZSBzdGFuZGluZyBvcmRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGZvciBzdGFuZGluZyBvcmRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXMge1xuICAgIElucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HJyxcbiAgICBJbml0aWF0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEJyxcbiAgICBJbnN1ZmZpY2llbnRGdW5kcyA9ICdQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFMnLFxuICAgIEZhaWxlZCA9ICdQQVlNRU5UX1NUQVRVU19GQUlMRUQnLFxuICAgIEJsb2NrZWQgPSAnUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRCcsXG4gICAgVW5rbm93biA9ICdQQVlNRU5UX1NUQVRVU19VTktOT1dOJyxcbiAgICBFeGVjdXRlZCA9ICdQQVlNRU5UX1NUQVRVU19FWEVDVVRFRCcsXG4gICAgU2V0dGxlZCA9ICdQQVlNRU5UX1NUQVRVU19TRVRUTEVEJyxcbiAgICBBdXRob3Jpc2luZyA9ICdQQVlNRU5UX1NUQVRVU19BVVRIT1JJU0lORycsXG4gICAgQ2FuY2VsbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NBTkNFTExFRCcsXG4gICAgRXN0YWJsaXNoZWQgPSAnUEFZTUVOVF9TVEFUVVNfRVNUQUJMSVNIRUQnLFxuICAgIFJlamVjdGVkID0gJ1BBWU1FTlRfU1RBVFVTX1JFSkVDVEVEJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgcGF5bWVudF90b2tlbmAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciB0aGUgcGF5bWVudCBpbml0aWF0aW9uIGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSB0b2tlbiB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBwYXltZW50X3Rva2VuYCBleHBpcmVzIGFmdGVyIDE1IG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW5fZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gcmVjaXBpZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC4gV2UgcmVjb21tZW5kIHVzaW5nIHN0cmluZ3Mgb2YgbGVuZ3RoIDE4IG9yIGxlc3MgYW5kIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVycyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LiBJZiBCQUNTIGRhdGEgaXMgbm90IHByb3ZpZGVkLCBhbiBJQkFOIGlzIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgcmVjaXBpZW50cyBjcmVhdGVkIGZvciBQYXltZW50IEluaXRpYXRpb25cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudHM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHZhbGlkIFBheW1lbnQgSW5pdGlhdGlvbiBzdGFuZGluZyBvcmRlciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgY2xvc2VkLWVuZGVkIHN0YW5kaW5nIG9yZGVycyBieSBwcm92aWRpbmcgYW4gZW5kIGRhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfZW5kX2RhdGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVycy4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIG5lZ2F0aXZlIGludGVnZXJzICgtMSB0byAtNSkgZm9yIHNldHRpbmcgdXAgYSBgTU9OVEhMWWAgc3RhbmRpbmcgb3JkZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfbmVnYXRpdmVfZXhlY3V0aW9uX2RheXM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSB2YWxpZCBzdGFuZGluZyBvcmRlciBpbnRlcnZhbHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHZhbGlkX3N0YW5kaW5nX29yZGVyX2ludGVydmFsczogQXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBpbnRlci1iYW5rIHRyYW5zZmVycy4gSWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QgYW4gaW50ZXItYmFuayB0cmFuc2ZlciwgYWxsIGZpZWxkcyB3aWxsIGJlIGBudWxsYC4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhlIGBwYXltZW50X21ldGFgIGtleSB3aWxsIGFsd2F5cyBhcHBlYXIsIGJ1dCBubyBkYXRhIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRNZXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIG51bWJlciBzdXBwbGllZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVmZXJlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIFBQRCBJRCBmb3IgdGhlIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydHkgaW5pdGlhdGluZyBhIHdpcmUgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYSB3aXJlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgYnlfb3JkZXJfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcGF5aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheW1lbnQgcHJvY2Vzc29yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2Nlc3Nvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyB1cGRhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGNyZWF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgZGVsZXRlZCBhdC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgUGF5bWVudCBQcm9maWxlIGhhcyBub3QgYmVlbiBkZWxldGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRQcm9maWxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50UHJvZmlsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gIGBSRUFEWWA6IFRoaXMgUGF5bWVudCBQcm9maWxlIGlzIHJlYWR5IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLiAgYFBFTkRJTkdgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyBub3QgcmVhZHkgdG8gYmUgdXNlZC4gWW914oCZbGwgbmVlZCB0byBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQgdG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLiAgYFJFTU9WRURgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBoYXMgYmVlbiByZW1vdmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFByb2ZpbGVTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgUmVhZHkgPSAnUkVBRFknLFxuICAgIFJlbW92ZWQgPSAnUkVNT1ZFRCdcbn1cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGludGVydmFsIG9mIHRoZSBwYXltZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWwge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBQYXltZW50IHNjaGVtZS4gSWYgbm90IHNwZWNpZmllZCAtIHRoZSBkZWZhdWx0IGluIHRoZSByZWdpb24gd2lsbCBiZSB1c2VkIChlLmcuIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmAgZm9yIEVVKS4gVXNpbmcgdW5zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgcmVzdWx0IGluIGEgZmFpbGVkIHBheW1lbnQuICBgTE9DQUxfREVGQVVMVGA6IFRoZSBkZWZhdWx0IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQuICBgTE9DQUxfSU5TVEFOVGA6IFRoZSBpbnN0YW50IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQgKGlmIGFwcGxpY2FibGUpLiBGZWVzIG1heSBiZSBhcHBsaWVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSWYgdGhlIG1hcmtldCBkb2VzIG5vdCBzdXBwb3J0IGFuIEluc3RhbnQgU2NoZW1lIChlLmcuIERlbm1hcmspLCB0aGUgZGVmYXVsdCBpbiB0aGUgcmVnaW9uIHdpbGwgYmUgdXNlZC4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gTWF5IGludm9sdmUgYWRkaXRpb25hbCBmZWVzIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBhdCBzb21lIGJhbmtzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBMb2NhbERlZmF1bHQgPSAnTE9DQUxfREVGQVVMVCcsXG4gICAgTG9jYWxJbnN0YW50ID0gJ0xPQ0FMX0lOU1RBTlQnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVlNRU5UX0lOSVRJQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBmb3IgdGhlIHBheW1lbnQgYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3BheW1lbnRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSB3aGVuIGNyZWF0aW5nIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYWxfcmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFkanVzdGVkX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBgc3RhcnRfZGF0ZWAgcHJvdmlkZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBhIHN0YW5kaW5nIG9yZGVyLiBJZiB0aGUgcGF5bWVudCBpcyBub3QgYSBzdGFuZGluZyBvcmRlciwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgb3IgaWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhY2NvdW50IGxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSW5jb21lUmF0ZU9mUGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAgICAgKi9cbiAgICByYXRlX29mX3BheTogUGF5cm9sbEluY29tZVJhdGVPZlBheTtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHBheXJvbGwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZU9iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5IHN0dWJzIGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0UGF5U3R1Yj59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBwYXlfc3R1YnM6IEFycmF5PENyZWRpdFBheVN0dWI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRheCBmb3JtIFctMnMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFcyPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIHcyczogQXJyYXk8Q3JlZGl0VzI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRheCBmb3JtIDEwOTlzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXQxMDk5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIGZvcm0xMDk5czogQXJyYXk8Q3JlZGl0MTA5OT47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJhdGUgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdGUgYXQgd2hpY2ggYW4gZW1wbG95ZWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gICAgICovXG4gICAgcGF5X3JhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgYXQgd2hpY2ggYW4gZW1wbG95ZWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gICAgICovXG4gICAgcGF5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZU9iamVjdD59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU6IEFycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSXRlbVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB0aGUgcHJvY2Vzc2luZyBzdGF0dXMgZm9yIHRoZSB2ZXJpZmljYXRpb24uICBgVU5LTk9XTmA6IFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIHVzZXIgaGFzIGFwcHJvdmVkIGZvciBzaGFyaW5nLiBUaGUgZGF0YSBpcyBhdmFpbGFibGUgdG8gYmUgcmV0cmlldmVkLiAgYFBST0NFU1NJTkdgOiBUaGUgdmVyaWZpY2F0aW9uIGlzIHN0aWxsIHByb2Nlc3NpbmcuIFRoZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUgeWV0LiAgYEZBSUxFRGA6IFRoZSBwcm9jZXNzaW5nIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuICBgQVBQUk9WQUxfU1RBVFVTX1BFTkRJTkdgOiBUaGUgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkIGJ1dCB0aGUgdXNlciBoYXMgbm90IHlldCBhcHByb3ZlZCB0aGUgc2hhcmluZyBvZiB0aGUgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHByb2Nlc3Npbmdfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZnJhdWQgcmlzayBkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIEl0ZW0gbGlua2VkIGFzIHBhcnQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaW5jb21lIGRvY3VtZW50IGF1dGhlbnRpY2l0eSBkYXRhIHJldHJpZXZlZCBmb3IgZWFjaCBvZiB0aGUgdXNlclxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3Jpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdD47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IERlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRvY19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzOiBFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBQYXlzdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X2RldGFpbHM/OiBFbXBsb3ltZW50RGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgbmV0X3BheTogTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlQZXJpb2REZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5c3R1Yl9kZXRhaWxzPzogUGF5c3R1YkRldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViWVRERGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX2Vhcm5pbmdzPzogUGF5c3R1YllURERldGFpbHM7XG59XG4vKipcbiAqIEFkZHJlc3Mgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXRlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWR1Y3Rpb24gb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uLCBhcyBwcm92aWRlZCBvbiB0aGUgcGF5c3R1Yi4gRm9yIGV4YW1wbGU6IGBcXFwiNDAxKGspXFxcImAsIGBcXFwiRklDQSBNRUQgVEFYXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBkZWR1Y3Rpb24gaXMgcHJlLXRheDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICBpc19wcmV0YXg6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGV0YWlscyB0aGF0IGNhbiBiZSBmb3VuZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQmVnaW5uaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmRpbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2VuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQYXkgZGF0ZSBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIHBheXN0dWIsIGUuZy4gQURQXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlzdHViX3Byb3ZpZGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YlBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5c3R1YlBheUZyZXF1ZW5jeSB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1YlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZnJvbSBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJPdmVycmlkZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlTmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuZXRfcGF5PzogUGF5c3R1Yk92ZXJyaWRlTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zPzogUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVhcm5pbmdzPzogUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlscz86IFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHM7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsPzogUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5c3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bj86IEFycmF5PFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbD86IFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVhcm5pbmdzIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IGZvciB0aGUgdG90YWwgZWFybmluZ3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llZSBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTWFyaXRhbCBzdGF0dXMgb2YgdGhlIGVtcGxveWVlIC0gZWl0aGVyIGBzaW5nbGVgIG9yIGBtYXJyaWVkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICB0YXhwYXllcl9pZD86IFBheXN0dWJPdmVycmlkZVRheHBheWVySUQ7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzcztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldCBwYXkgYW1vdW50IG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVOZXRQYXkge1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVRheHBheWVySURcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBlbXBsb3llZSBpcyBwYWlkLiBQb3NzaWJsZSB2YWx1ZXM6IGBNT05USExZYCwgYEJJLVdFRUtMWWAsIGBXRUVLTFlgLCBgU0VNSS1NT05USExZYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheXN0dWJQYXlGcmVxdWVuY3kge1xuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQmlXZWVrbHkgPSAnQkktV0VFS0xZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JLU1PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIGluY29tZSBlYXJuZWQgeWVhciB0byBkYXRlLCBhcyBiYXNlZCBvbiBwYXlzdHViIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBncm9zcyBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgbmV0ICh0YWtlIGhvbWUpIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgbmV0X2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtIGlzIGV4cGVjdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZC4gVGhlIHdlYmhvb2sgd2lsbCBjdXJyZW50bHkgYmUgZmlyZWQgNyBkYXlzIGJlZm9yZSB0aGUgZXhpc3RpbmcgSXRlbSBpcyBzY2hlZHVsZWQgZm9yIGRpc2Nvbm5lY3Rpb24uIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIFt1cGRhdGUgbW9kZV0oaHR0cDovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBDdXJyZW50bHksIHRoaXMgd2ViaG9vayBpcyBmaXJlZCBvbmx5IGZvciBVUyBvciBDYW5hZGlhbiBpbnN0aXR1dGlvbnM7IGluIHRoZSBVSyBvciBFVSwgeW91IHNob3VsZCBjb250aW51ZSB0byBsaXN0ZWQgZm9yIHRoZSBbYFBFTkRJTkdfRVhQSVJBVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNwZW5kaW5nX2V4cGlyYXRpb24pIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19ESVNDT05ORUNUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlbmRpbmdEaXNjb25uZWN0V2ViaG9va1JlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgcmVhc29uOiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tSZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVhc29uIHdoeSB0aGUgaXRlbSBpcyBhYm91dCB0byBiZSBkaXNjb25uZWN0ZWQuIGBJTlNUSVRVVElPTl9NSUdSQVRJT05gOiBUaGUgaW5zdGl0dXRpb24gaXMgbW92aW5nIHRvIEFQSSBvciB0byBhIGRpZmZlcmVudCBpbnRlZ3JhdGlvbi4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIG9jY3VyIHdoZW4gYW4gaW5zdGl0dXRpb24gbW92ZXMgZnJvbSBhIG5vbi1PQXV0aCBpbnRlZ3JhdGlvbiB0byBhbiBPQXV0aCBpbnRlZ3JhdGlvbi4gYElOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT05gOiBUaGUgY29uc2VudCBvbiBhbiBJdGVtIGFzc29jaWF0ZWQgd2l0aCBhIFVTIG9yIENBIGluc3RpdHV0aW9uIGlzIGFib3V0IHRvIGV4cGlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1JlYXNvbiB7XG4gICAgTWlncmF0aW9uID0gJ0lOU1RJVFVUSU9OX01JR1JBVElPTicsXG4gICAgVG9rZW5FeHBpcmF0aW9uID0gJ0lOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT04nXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVt4oCZcyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLiBUaGlzIHdlYmhvb2sgaXMgZmlyZWQgb25seSBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgKGluY2x1ZGluZyB0aGUgVUspOyBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgb3IgQ2FuYWRhLCBzZWUgW2BQRU5ESU5HX0RJU0NPTk5FQ1RgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jcGVuZGluZ19kaXNjb25uZWN0KSBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIE1vc3QgcmVsZXZhbnQgZm9yIHBlcnNvbmFsIGZpbmFuY2UgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgQ1NWIGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyB0byBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgZnJvbSB0aGUgbGVnYWN5IGNhdGVnb3JpZXMsIGFsc28gcmVmZXIgdG8gdGhlIFtgbWlncmF0aW9uIGd1aWRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjYXRlZ29yaWVzIGFjY3VyYXRlbHkgZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uIGludGVudC4gIGBWRVJZX0hJR0hgOiBXZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgTE9XYDogVGhpcyBjYXRlZ29yeSBtYXkgcmVmbGVjdCB0aGUgaW50ZW50LCBidXQgdGhlcmUgbWF5IGJlIG90aGVyIGNhdGVnb3JpZXMgdGhhdCBhcmUgbW9yZSBhY2N1cmF0ZS4gYFVOS05PV05gOiBXZSBkb27igJl0IGtub3cgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBwaG9uZSBudW1iZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgcGhvbmUgbnVtYmVyIGFzIHRoZSBwcmltYXJ5IG51bWJlciBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogUGhvbmVOdW1iZXJUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQaG9uZU51bWJlclR5cGVFbnVtIHtcbiAgICBIb21lID0gJ2hvbWUnLFxuICAgIFdvcmsgPSAnd29yaycsXG4gICAgT2ZmaWNlID0gJ29mZmljZScsXG4gICAgTW9iaWxlID0gJ21vYmlsZScsXG4gICAgTW9iaWxlMSA9ICdtb2JpbGUxJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBwaG9uZSBudW1iZXIgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBwaG9uZSBudW1iZXIgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBwaG9uZSBudW1iZXIuIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2gsIDk5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCAobWF0Y2hpbmcgdGhlIHNhbWUgcGhvbmUgbnVtYmVyIHdpdGggZXh0ZW5zaW9uIGFnYWluc3Qgb25lIHdpdGhvdXQgZXh0ZW5zaW9uLCBldGMuKSwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIHBob25lIG51bWJlciBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHBob25lIG51bWJlciBpcyBhIHBob25lIGxpbmUgb3IgYSBmYXggbGluZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBob25lVHlwZSB7XG4gICAgUGhvbmUgPSAncGhvbmUnLFxuICAgIEZheCA9ICdmYXgnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgZGV0ZWN0ZWQgaW4gdGhlIGltYWdlcyBwcm92aWRlZC4gV2lsbCBhbHdheXMgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICBgZHJpdmVyc19saWNlbnNlYCAtIEEgZHJpdmVyXFwncyBsaWNlbnNlIGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5LCBlc3RhYmxpc2hpbmcgaWRlbnRpdHkgd2l0aG91dCBhbnkgZ3VhcmFudGVlIGFzIHRvIGNpdGl6ZW5zaGlwLCBhbmQgZ3JhbnRpbmcgZHJpdmluZyBwcml2aWxlZ2VzICAgIGBpZF9jYXJkYCAtIEEgZ2VuZXJhbCBuYXRpb25hbCBpZGVudGlmaWNhdGlvbiBjYXJkLCBkaXN0aW5jdCBmcm9tIGRyaXZlclxcJ3MgbGljZW5zZXMgYXMgaXQgb25seSBlc3RhYmxpc2hlcyBpZGVudGl0eSAgICBgcGFzc3BvcnRgIC0gQSB0cmF2ZWwgcGFzc3BvcnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgZm9yIG9uZSBvZiBpdHMgY2l0aXplbnMgICAgYHJlc2lkZW5jZV9wZXJtaXRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT50ZW1wb3JhcmlseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgcmVzaWRlbnRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT5wZXJtYW5lbnRseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgdmlzYWAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIGVudHJ5IGZvciBhIHNob3J0IGR1cmF0aW9uIGFuZCBmb3IgYSBzcGVjaWZpYyBwdXJwb3NlLCB0eXBpY2FsbHkgbm8gbG9uZ2VyIHRoYW4gNiBtb250aHMgIE5vdGU6IFRoaXMgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBJRCB0eXBlIHRoYXQgdGhlIHVzZXIgc2VsZWN0cyB3aXRoaW4gTGluay4gRm9yIGV4YW1wbGUsIGlmIHRoZXkgc2VsZWN0IFxcXCJEcml2ZXJcXCdzIExpY2Vuc2VcXFwiIGJ1dCB0aGVuIHN1Ym1pdCBhIHBpY3R1cmUgb2YgYSBwYXNzcG9ydCwgdGhpcyBmaWVsZCB3aWxsIHNheSBgcGFzc3BvcnRgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnkge1xuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSWRDYXJkID0gJ2lkX2NhcmQnLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBSZXNpZGVuY2VQZXJtaXRDYXJkID0gJ3Jlc2lkZW5jZV9wZXJtaXRfY2FyZCcsXG4gICAgUmVzaWRlbnRDYXJkID0gJ3Jlc2lkZW50X2NhcmQnLFxuICAgIFZpc2EgPSAndmlzYSdcbn1cblxuLyoqXG4gKiBEYXRhIGV4dHJhY3RlZCBmcm9tIGEgdXNlci1zdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGEge1xuICAgIC8qKlxuICAgICAqIEFscGhhLW51bWVyaWMgSUQgbnVtYmVyIGV4dHJhY3RlZCB2aWEgT0NSIGZyb20gdGhlIHVzZXJcXCdzIGRvY3VtZW50IGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaXNzdWluZ19yZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2UgfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB0aGUgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgc3VibWl0dGVkIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50TmFtZU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWU6IERvY3VtZW50TmFtZU1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IERvY3VtZW50RGF0ZU9mQmlydGhNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGlyYXRpb25EYXRlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBFeHBpcmF0aW9uRGF0ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXNzdWluZ0NvdW50cnl9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpc3N1aW5nX2NvdW50cnk6IElzc3VpbmdDb3VudHJ5O1xufVxuLyoqXG4gKiBVUkxzIGZvciBkb3dubG9hZGluZyBvcmlnaW5hbCBhbmQgY3JvcHBlZCBpbWFnZXMgZm9yIHRoaXMgZG9jdW1lbnQgc3VibWlzc2lvbi4gVGhlIFVSTHMgYXJlIGRlc2lnbmVkIHRvIG9ubHkgYWxsb3cgZG93bmxvYWRpbmcsIG5vdCBob3QgbGlua2luZywgc28gdGhlIFVSTCB3aWxsIG9ubHkgc2VydmUgdGhlIGRvY3VtZW50IGltYWdlIGZvciA2MCBzZWNvbmRzIGJlZm9yZSBleHBpcmluZy4gVGhlIGV4cGlyYXRpb24gdGltZSBpcyA2MCBzZWNvbmRzIGFmdGVyIHRoZSBgR0VUYCByZXF1ZXN0IGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC4gQSBuZXcgZXhwaXJpbmcgVVJMIGlzIGdlbmVyYXRlZCB3aXRoIGVhY2ggcmVxdWVzdCwgc28geW91IGNhbiBhbHdheXMgcmVyZXF1ZXN0IHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBpZiBvbmUgb2YgeW91ciBVUkxzIGV4cGlyZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzIHtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyB0aGUgdW5jcm9wcGVkIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBmcm9udCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIG9yaWdpbmFsX2Zyb250OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIHRoZSBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50IHdhcyBub3QgY29sbGVjdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9iYWNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcHBlZCBpbWFnZSBjb250YWluaW5nIGp1c3QgdGhlIGZyb250IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgY3JvcHBlZF9mcm9udDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3BwZWQgaW1hZ2UgY29udGFpbmluZyBqdXN0IHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudC4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQgd2FzIG5vdCBjb2xsZWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGNyb3BwZWRfYmFjazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3Agb2YganVzdCB0aGUgdXNlclxcJ3MgZmFjZSBmcm9tIHRoZSBkb2N1bWVudCBpbWFnZS4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBhIGZhY2UgcGhvdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGZhY2U6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBQbGFpZCBDaGVjayBzY29yZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQbGFpZENoZWNrU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFpZENoZWNrU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSB0aGUgUGxhaWQgQ2hlY2sgU2NvcmUgbW9kZWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRDaGVja1Njb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgUGxhaWQgQ2hlY2sgc2NvcmUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQ2hlY2tTY29yZVxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSBQbGFpZCBDaGVjayBzY29yZSBjb3VsZCBub3QgYmUgY29tcHV0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRDaGVja1Njb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRXJyb3JzIGFyZSBpZGVudGlmaWVkIGJ5IGBlcnJvcl9jb2RlYCBhbmQgY2F0ZWdvcml6ZWQgYnkgYGVycm9yX3R5cGVgLiBVc2UgdGhlc2UgaW4gcHJlZmVyZW5jZSB0byBIVFRQIHN0YXR1cyBjb2RlcyB0byBpZGVudGlmeSBhbmQgaGFuZGxlIHNwZWNpZmljIGVycm9ycy4gSFRUUCBzdGF0dXMgY29kZXMgYXJlIHNldCBhbmQgcHJvdmlkZSB0aGUgYnJvYWRlc3QgY2F0ZWdvcml6YXRpb24gb2YgZXJyb3JzOiA0eHggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBlcnJvcnMsIGFuZCA1eHggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGVycm9ycywgYW5kIHRoZSBzdGF0dXMgd2lsbCBiZSAyeHggaW4gbm9uLWVycm9yIGNhc2VzLiBBbiBJdGVtIHdpdGggYSBub24tYG51bGxgIGVycm9yIG9iamVjdCB3aWxsIG9ubHkgYmUgcGFydCBvZiBhbiBBUEkgcmVzcG9uc2Ugd2hlbiBjYWxsaW5nIGAvaXRlbS9nZXRgIHRvIHZpZXcgSXRlbSBzdGF0dXMuIE90aGVyd2lzZSwgZXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZDsgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBhbiBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYWlkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2Vy4oCZcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlcuKAmXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGVfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uICBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGlzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgb25seSBiZSBwcm92aWRlZCBmb3IgdGhlIGBlcnJvcl90eXBlYCBgQVNTRVRfUkVQT1JUX0VSUk9SYC4gYGNhdXNlc2Agd2lsbCBhbHNvIG5vdCBiZSBwb3B1bGF0ZWQgaW5zaWRlIGFuIGVycm9yIG5lc3RlZCB3aXRoaW4gYSBgd2FybmluZ2Agb2JqZWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgY2F1c2VzPzogQXJyYXk8YW55PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLiBUaGlzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keSB3aGVuIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3VnZ2VzdGVkX2FjdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGxhaWRFcnJvclR5cGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ0lOVkFMSURfUkVRVUVTVCcsXG4gICAgSW52YWxpZFJlc3VsdCA9ICdJTlZBTElEX1JFU1VMVCcsXG4gICAgSW52YWxpZElucHV0ID0gJ0lOVkFMSURfSU5QVVQnLFxuICAgIEluc3RpdHV0aW9uRXJyb3IgPSAnSU5TVElUVVRJT05fRVJST1InLFxuICAgIFJhdGVMaW1pdEV4Y2VlZGVkID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgIEFwaUVycm9yID0gJ0FQSV9FUlJPUicsXG4gICAgSXRlbUVycm9yID0gJ0lURU1fRVJST1InLFxuICAgIEFzc2V0UmVwb3J0RXJyb3IgPSAnQVNTRVRfUkVQT1JUX0VSUk9SJyxcbiAgICBSZWNhcHRjaGFFcnJvciA9ICdSRUNBUFRDSEFfRVJST1InLFxuICAgIE9hdXRoRXJyb3IgPSAnT0FVVEhfRVJST1InLFxuICAgIFBheW1lbnRFcnJvciA9ICdQQVlNRU5UX0VSUk9SJyxcbiAgICBCYW5rVHJhbnNmZXJFcnJvciA9ICdCQU5LX1RSQU5TRkVSX0VSUk9SJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25FcnJvciA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX0VSUk9SJyxcbiAgICBNaWNyb2RlcG9zaXRzRXJyb3IgPSAnTUlDUk9ERVBPU0lUU19FUlJPUicsXG4gICAgU2FuZGJveEVycm9yID0gJ1NBTkRCT1hfRVJST1InLFxuICAgIFBhcnRuZXJFcnJvciA9ICdQQVJUTkVSX0VSUk9SJyxcbiAgICBUcmFuc2FjdGlvbnNFcnJvciA9ICdUUkFOU0FDVElPTlNfRVJST1InLFxuICAgIFRyYW5zYWN0aW9uRXJyb3IgPSAnVFJBTlNBQ1RJT05fRVJST1InLFxuICAgIFRyYW5zZmVyRXJyb3IgPSAnVFJBTlNGRVJfRVJST1InXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBzZXQgb2YgaWRzIHJlbGF0ZWQgdG8gYW4gZW1wbG95ZWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhdGZvcm1JZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUlkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIENhc2hTY29yZcKuIHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUNhc2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgY2FzaCBzY29yZSBtb2RlbCB1c2VkLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYG1vZGVsX3ZlcnNpb25gLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgY2FzaCBzY29yZSBtb2RlbCB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgbW9kZWxfdmVyc2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS4gUmFuZ2VzIGZyb20gMS05OTksIHdpdGggaGlnaGVyIHNjb3JlIGluZGljYXRpbmcgbG93ZXIgcmlzay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbnMgZm9yIGFuIGluZGl2aWR1YWwgaGF2aW5nIHJpc2sgYWNjb3JkaW5nIHRvIHRoZSBjYXNoIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgcHJvdmlkZWQgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmVNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4X2FnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXRlc3QgY3JlZGl0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlX2NyZWRpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IGRlYml0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlX2RlYml0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgZGViaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2VfZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCBjcmVkaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2VfY3JlZGl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBudW1fdHJ4bl9jcmVkaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRlYml0IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbnVtX3RyeG5fZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbDFtX2NyZWRpdF92YWx1ZV9jbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCAzMCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsMW1fZGViaXRfdmFsdWVfY250OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBDYXNoU2NvcmUuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtQ2FzaFNjb3JlVmVyc2lvbiB7XG4gICAgXzNMaXRlID0gJzNfbGl0ZScsXG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIEZpcnN0RGV0ZWN0IHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21GaXJzdERldGVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtRmlyc3REZXRlY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIEZpcnN0RGV0ZWN0IG1vZGVsIHVzZWQuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgbW9kZWxfdmVyc2lvbmAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIEZpcnN0RGV0ZWN0IG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbnMgZm9yIGFuIGluZGl2aWR1YWwgaGF2aW5nIHJpc2sgYWNjb3JkaW5nIHRvIHRoZSBGaXJzdERldGVjdCBzY29yZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IFByaXNtQ2FzaFNjb3JlTWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHJldHVybmVkIGJ5IFByaXNtIGZvciB0aGlzIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gRmlyc3REZXRlY3QuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtRmlyc3REZXRlY3RWZXJzaW9uIHtcbiAgICBfMyA9ICczJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGRhdGEgZnJvbSB0aGUgSW5zaWdodHMgcHJvZHVjdCByZXR1cm5lZCBieSBQcmlzbSBEYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgaW5zaWdodHMgbW9kZWwgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUluc2lnaHRzXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnNpZ2h0cyBSZXN1bHQgb2JqZWN0IGlzIGEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQgb3Igc3RyaW5nLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIFByaXNtSW5zaWdodHNcbiAgICAgKi9cbiAgICByZXN1bHQ/OiBvYmplY3Q7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHJldHVybmVkIGJ5IFByaXNtIGZvciB0aGlzIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gSW5zaWdodHMuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtSW5zaWdodHNWZXJzaW9uIHtcbiAgICBfMyA9ICczJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIFByaXNtIHByb2R1Y3RzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUElcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtUHJvZHVjdCB7XG4gICAgSW5zaWdodHMgPSAnaW5zaWdodHMnLFxuICAgIFNjb3JlcyA9ICdzY29yZXMnXG59XG5cbi8qKlxuICogVGhlIHZlcnNpb25zIG9mIFByaXNtIHByb2R1Y3RzIHRvIGV2YWx1YXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtVmVyc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbVZlcnNpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21GaXJzdERldGVjdFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBmaXJzdGRldGVjdD86IFByaXNtRmlyc3REZXRlY3RWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zXG4gICAgICovXG4gICAgY2FzaHNjb3JlPzogUHJpc21DYXNoU2NvcmVWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21JbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBpbnNpZ2h0cz86IFByaXNtSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQcm9jZXNzb3JOdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgKmFuZCogb25lIG9yIG1vcmUgYWNjb3VudCB0eXBlcyBiZWluZyByZXF1ZXN0ZWQgaXMgYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IChzdWNoIGFzIGEgY3JlZGl0IGNhcmQpIGFzIENhcGl0YWwgT25lIGRvZXMgbm90IHByb3ZpZGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBJbiB0aGlzIGNhc2UsIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgYXMgd2VsbCBhcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cyBhdCBDYXBpdGFsIE9uZSAoaW5jbHVkaW5nIGFsbCBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cykgdGhpcyBmaWVsZCBpcyBpZ25vcmVkIGFuZCByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGZldGNoZWQuICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBpZ25vcmVkLCBhbmQgbm8gYWNjZXB0YWJsZSBiYWxhbmNlIGlzIGF2YWlsYWJsZSwgYW4gYElOVkFMSURfUkVTVUxUYCBlcnJvciB3aXRoIHRoZSBjb2RlIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBISVNUT1JJQ0FMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5TWF0Y2hVc2VyO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gVGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOSVRJQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzbWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gSW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaWRlbnRpZnlpbmcgbnVtYmVycyB1c2VkIGZvciBtYWtpbmcgZWxlY3Ryb25pYyB0cmFuc2ZlcnMgdG8gYW5kIGZyb20gdGhlIGBhY2NvdW50YC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQkFDUykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgdGhlIGBhY2NvdW50YCBmb3Igd2hpY2ggYXV0aCBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCwgYSBudWxsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNBQ0hOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYWNoPzogTnVtYmVyc0FDSE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0VGVE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBlZnQ/OiBOdW1iZXJzRUZUTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGJhY3M/OiBOdW1iZXJzQkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YSBpcyB1cGRhdGVkLiBUaGlzIGluY2x1ZGVzIHdoZW4gYSBuZXcgcmVjdXJyaW5nIHN0cmVhbSBpcyBkZXRlY3RlZCBvciB3aGVuIGEgbmV3IHRyYW5zYWN0aW9uIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHJlY3VycmluZyBzdHJlYW0uIFRoZSBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgIHdlYmhvb2sgd2lsbCBhbHNvIGZpcmUgd2hlbiBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWN1cnJpbmcgc3RyZWFtIGNoYW5nZXMsIHdoaWNoIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLCB1cGRhdGUsIG9yIHJlbW92YWwgb2YgdHJhbnNhY3Rpb25zIHRvIHRoZSBzdHJlYW0uICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIHVwZGF0ZWQgZGF0YSBjYW4gYmUgZmV0Y2hlZCBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICoqdHJ1ZSoqIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gaXMgYSByZWN1cnJpbmcgdHJhbnNhY3Rpb247ICoqZmFsc2UqKiBvdGhlcndpc2UgXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOQUNIQS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSBgUkVBTF9USU1FX1BBWU1FTlRTYDogcmVhbC10aW1lIHBheW1lbnRzIHN1Y2ggYXMgUlRQIGFuZCBGZWROb3cgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIFJ1bGVzZXQgdG8gdXNlIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSBhIFJ1bGVzZXQgdXNpbmcgdGhlIFNpZ25hbCBkYXNoYm9hcmQgbG9jYXRlZCB3aXRoaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgbm90IHByb3ZpZGVkLCBubyBSdWxlc2V0IHdpbGwgYmUgdXNlZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZXNldF9rZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvcmVfYXR0cmlidXRlcz86IFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1J1bGVzZXR9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlc2V0PzogUnVsZXNldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5fY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmV0dXJucyBmcm9tIHlvdXIgcGF5bWVudCBwcm9jZXNzb3JzLCBpbiBJU08gODYwMSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5lZF9hdD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzZW50IHRvIFN0cmlwZSBmb3IgdXNlIGluIG1ha2luZyBBUEkgY2FsbHMgdG8gUGxhaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdHJpcGVfYmFua19hY2NvdW50X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyBjaGFuZ2UuIFRoaXMgY2FuIGJlIGR1ZSB0byBhbnkgZXZlbnQgcmVzdWx0aW5nIGluIG5ldyBjaGFuZ2VzLCBzdWNoIGFzIGFuIGluaXRpYWwgMzAtZGF5IHRyYW5zYWN0aW9ucyBmZXRjaCB1cG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiBhbiBJdGVtIHdpdGggdHJhbnNhY3Rpb25zLCB0aGUgYmFja2ZpbGwgb2YgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgdGhhdCBvY2N1cnMgc2hvcnRseSBhZnRlciwgb3Igd2hlbiBjaGFuZ2VzIGFyZSBwb3B1bGF0ZWQgZnJvbSBhIHJlZ3VsYXJseS1zY2hlZHVsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBqb2IuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIHdoZW4gdXNpbmcgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHRoZSBvbGRlciB3ZWJob29rcyBgSU5JVElBTF9VUERBVEVgLCBgSElTVE9SSUNBTF9VUERBVEVgLCBgREVGQVVMVF9VUERBVEVgLCBhbmQgYFRSQU5TQUNUSU9OU19SRU1PVkVEYCwgd2hpY2ggYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgd2lsbCBhbHNvIGNvbnRpbnVlIHRvIGJlIHNlbnQgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aG9zZSB3ZWJob29rcyB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBhbiBJdGVtLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Ugb24gdGhhdCBJdGVtLiBUaGlzIG1lYW5zIHRoYXQsIHVubGlrZSB0aGUgYElOSVRJQUxfVVBEQVRFYCBhbmQgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rcywgaXQgd2lsbCBub3QgZmlyZSBpbW1lZGlhdGVseSB1cG9uIEl0ZW0gY3JlYXRpb24uIElmIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGlzIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgd2FzICpub3QqIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zLCB0aGUgd2ViaG9vayB3aWxsIGZpcmUgdHdpY2U6IG9uY2UgdGhlIGZpcnN0IDMwIGRheXMgb2YgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZCwgYW5kIGEgc2Vjb25kIHRpbWUgd2hlbiBhbGwgYXZhaWxhYmxlIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4gIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgdHJhbnNhY3Rpb25zIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluaXRpYWwgcHVsbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGluaXRpYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBoaXN0b3JpY2FsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB5b3UgYXJlIGludGVncmF0aW5nIHdpdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yOiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW0ge1xuICAgIER3b2xsYSA9ICdkd29sbGEnLFxuICAgIEdhbGlsZW8gPSAnZ2FsaWxlbycsXG4gICAgTW9kZXJuVHJlYXN1cnkgPSAnbW9kZXJuX3RyZWFzdXJ5JyxcbiAgICBPY3JvbHVzID0gJ29jcm9sdXMnLFxuICAgIFZlc3RhID0gJ3Zlc3RhJyxcbiAgICBEcml2ZXdlYWx0aCA9ICdkcml2ZXdlYWx0aCcsXG4gICAgVm9wYXkgPSAndm9wYXknLFxuICAgIEFjaHEgPSAnYWNocScsXG4gICAgQ2hlY2sgPSAnY2hlY2snLFxuICAgIENoZWNrYm9vayA9ICdjaGVja2Jvb2snLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNpbGFNb25leSA9ICdzaWxhX21vbmV5JyxcbiAgICBSaXplID0gJ3JpemUnLFxuICAgIFN2YkFwaSA9ICdzdmJfYXBpJyxcbiAgICBVbml0ID0gJ3VuaXQnLFxuICAgIFd5cmUgPSAnd3lyZScsXG4gICAgTGl0aGljID0gJ2xpdGhpYycsXG4gICAgQWxwYWNhID0gJ2FscGFjYScsXG4gICAgQXN0cmEgPSAnYXN0cmEnLFxuICAgIE1vb3YgPSAnbW9vdicsXG4gICAgVHJlYXN1cnlQcmltZSA9ICd0cmVhc3VyeV9wcmltZScsXG4gICAgTWFycWV0YSA9ICdtYXJxZXRhJyxcbiAgICBDaGVja291dCA9ICdjaGVja291dCcsXG4gICAgU29saWQgPSAnc29saWQnLFxuICAgIEhpZ2hub3RlID0gJ2hpZ2hub3RlJyxcbiAgICBHZW1pbmkgPSAnZ2VtaW5pJyxcbiAgICBBcGV4Q2xlYXJpbmcgPSAnYXBleF9jbGVhcmluZycsXG4gICAgR3VzdG8gPSAnZ3VzdG8nLFxuICAgIEFkeWVuID0gJ2FkeWVuJyxcbiAgICBBdG9taWMgPSAnYXRvbWljJyxcbiAgICBJMmMgPSAnaTJjJyxcbiAgICBXZXBheSA9ICd3ZXBheScsXG4gICAgUmlza2lmaWVkID0gJ3Jpc2tpZmllZCcsXG4gICAgVXRiID0gJ3V0YicsXG4gICAgQWRwUm9sbCA9ICdhZHBfcm9sbCcsXG4gICAgRm9ydHJlc3NUcnVzdCA9ICdmb3J0cmVzc190cnVzdCcsXG4gICAgQm9uZCA9ICdib25kJyxcbiAgICBCYWtrdCA9ICdiYWtrdCcsXG4gICAgVGVhbCA9ICd0ZWFsJyxcbiAgICBaZXJvSGFzaCA9ICd6ZXJvX2hhc2gnLFxuICAgIFRhYmFQYXkgPSAndGFiYV9wYXknLFxuICAgIEtub3QgPSAna25vdCcsXG4gICAgU2FyZGluZSA9ICdzYXJkaW5lJyxcbiAgICBBbGxveSA9ICdhbGxveScsXG4gICAgRmluaXggPSAnZmluaXgnLFxuICAgIE51dmVpID0gJ251dmVpJyxcbiAgICBMYXllciA9ICdsYXllcicsXG4gICAgQm9vbSA9ICdib29tJyxcbiAgICBQYXlub3RlID0gJ3BheW5vdGUnLFxuICAgIFN0YWtlID0gJ3N0YWtlJyxcbiAgICBXZWRidXNoID0gJ3dlZGJ1c2gnLFxuICAgIEVzdXN1ID0gJ2VzdXN1JyxcbiAgICBBbnNhID0gJ2Fuc2EnLFxuICAgIFNjcmliZXVwID0gJ3NjcmliZXVwJyxcbiAgICBTdHJhZGRsZSA9ICdzdHJhZGRsZScsXG4gICAgTG9hbnBybyA9ICdsb2FucHJvJ1xufVxuXG4vKipcbiAqIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgIGFuZCBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2Nlc3Nvcl90b2tlbmAgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGJ5IHRoZSBQbGFpZCBwYXJ0bmVyIHRvIG1ha2UgQVBJIHJlcXVlc3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoYXQgdGhlIHByb2Nlc3NvciBoYXMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGluY2x1ZGluZyBmdXR1cmUgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IHdpbGwgZ3JhbnQgYWNjZXNzIHRvIGFsbCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYSBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgd2ViaG9vayBVUkwgZm9yIGEgcHJvY2Vzc29yIHRva2VuIHZpYSBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogYFBST0NFU1NPUl9UT0tFTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgdG8gYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gdHJhbnNhY3Rpb24ocykgZm9yIGFuIEl0ZW0gYXJlIGRlbGV0ZWQuIFRoZSBkZWxldGVkIHRyYW5zYWN0aW9uIElEcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdlYmhvb2sgcGF5bG9hZC4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIGRlbGV0ZWQgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUHJvdmlkaW5nIGl0IHdpbGwgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIG9ubHkgcmV0dXJuIGNoYW5nZXMgYWZ0ZXIgdGhpcyB1cGRhdGUuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiB1cGRhdGVzIHdpbGwgYmUgcmV0dXJuZWQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LWFkZGVkIHRyYW5zYWN0aW9ucyBvbiB0aGUgaXRlbS4gTm90ZTogVGhlIHVwcGVyLWJvdW5kIGxlbmd0aCBvZiB0aGlzIGN1cnNvciBpcyAyNTYgY2hhcmFjdGVycyBvZiBiYXNlNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfdXBkYXRlX3N0YXR1czogVHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyBleGlzdC4gSWYgdHJ1ZSwgdGhlIGFkZGl0aW9uYWwgdXBkYXRlcyBjYW4gYmUgZmV0Y2hlZCBieSBtYWtpbmcgYW4gYWRkaXRpb25hbCByZXF1ZXN0IHdpdGggYGN1cnNvcmAgc2V0IHRvIGBuZXh0X2N1cnNvcmAuIElmIGBoYXNfbW9yZWAgaXMgdHJ1ZSwgaXTigJlzIGltcG9ydGFudCB0byBwdWxsIGFsbCBhdmFpbGFibGUgcGFnZXMsIHRvIG1ha2UgaXQgbGVzcyBsaWtlbHkgZm9yIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VzIHRvIGNvbmZsaWN0IHdpdGggcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHByb2R1Y3QgYWNjZXNzIGJlaW5nIHJlcXVlc3RlZC4gVXNlZCB0byBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBhY3Jvc3MgYWxsIGFjY291bnRzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYWxsIHByb2R1Y3RzIGFsbG93ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0aGUgSWRlbnRpdHkgcHJvZHVjdCAobmFtZSwgZW1haWwsIHBob25lLCBhZGRyZXNzKS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gYWNjb3VudCBudW1iZXIgZGV0YWlscy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0cmFuc2FjdGlvbiBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX2RldGFpbHNfdHJhbnNhY3Rpb25zXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3JvdXRpbmdfbnVtYmVyXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfcm91dGluZ19udW1iZXI/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3N0YXRlbWVudHNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19zdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIFxcXCJhY2NvdW50c190YXhfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3RheF9zdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIFxcXCJjdXN0b21lcnNfcHJvZmlsZXNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBjdXN0b21lcnNfcHJvZmlsZXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIEF1dGguIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgcHV0dGluZyB0aGUgdXNlciB0aHJvdWdoIHVwZGF0ZSBtb2RlIHdpdGggYGF1dGhgIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIGxpbWl0ZWQgYmV0YSBmb3IgdXBkYXRlIG1vZGUgQXV0aGVudGljYXRpb24gcHJvZHVjdCB2YWxpZGF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gYEFDQ0VTU19OT1RfR1JBTlRFRGAgZXJyb3IgaXMgaGl0IGZvciBJZGVudGl0eS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgaWRlbnRpdHlgIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIGxpbWl0ZWQgYmV0YSBmb3IgdXBkYXRlIG1vZGUgSWRlbnRpdHkgcHJvZHVjdCB2YWxpZGF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUEVSTUlTU0lPTlNfUkVRVUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0dXMgaGVhbHRoIG9mIGEgcmVxdWVzdCB0eXBlLiBBdXRoIHJlcXVlc3RzLCBCYWxhbmNlIHJlcXVlc3RzLCBJZGVudGl0eSByZXF1ZXN0cywgSW52ZXN0bWVudHMgcmVxdWVzdHMsIExpYWJpbGl0aWVzIHJlcXVlc3RzLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgYW5kIEl0ZW0gbG9naW5zIGVhY2ggaGF2ZSB0aGVpciBvd24gc3RhdHVzIG9iamVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYGJyZWFrZG93bmAgb2JqZWN0LCB3aGljaCBwcm92aWRlcyBtb3JlIGdyYW51bGFyIGluc3RpdHV0aW9uIGhlYWx0aCBkYXRhLiAgYEhFQUxUSFlgOiB0aGUgbWFqb3JpdHkgb2YgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERFR1JBREVEYDogb25seSBzb21lIHJlcXVlc3RzIGFyZSBzdWNjZXNzZnVsIGBET1dOYDogYWxsIHJlcXVlc3RzIGFyZSBmYWlsaW5nXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3RhdHVzOiBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXR0ZWQgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN0YXR1cyBjaGFuZ2UgZm9yIHRoZSBpbnN0aXR1dGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX2NoYW5nZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzQnJlYWtkb3dufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtIHtcbiAgICBIZWFsdGh5ID0gJ0hFQUxUSFknLFxuICAgIERlZ3JhZGVkID0gJ0RFR1JBREVEJyxcbiAgICBEb3duID0gJ0RPV04nXG59XG5cbi8qKlxuICogQSBkZXRhaWxlZCBicmVha2Rvd24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBwZXJmb3JtYW5jZSBmb3IgYSByZXF1ZXN0IHR5cGUuIFRoZSB2YWx1ZXMgZm9yIGBzdWNjZXNzYCwgYGVycm9yX3BsYWlkYCwgYW5kIGBlcnJvcl9pbnN0aXR1dGlvbmAgc3VtIHRvIDEuIFRoZSB0aW1lIHJhbmdlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBicmVha2Rvd24gbWF5IHJhbmdlIGZyb20gdGhlIG1vc3QgcmVjZW50IGZldyBtaW51dGVzIHRvIHRoZSBwYXN0IHNpeCBob3Vycy4gSW4gZ2VuZXJhbCwgc21hbGxlciBpbnN0aXR1dGlvbnMgd2lsbCBzaG93IHN0YXR1cyB0aGF0IHdhcyBjYWxjdWxhdGVkIG92ZXIgYSBsb25nZXIgcGVyaW9kIG9mIHRpbWUuIEZvciBJbnZlc3RtZW50IHVwZGF0ZXMsIHdoaWNoIGFyZSByZWZyZXNoZWQgbGVzcyBmcmVxdWVudGx5LCB0aGUgcGVyaW9kIGFzc2Vzc2VkIG1heSBiZSAyNCBob3VycyBvciBtb3JlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0luc3RpdHV0aW9uIHN0YXR1cyBkZXRhaWxzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI2luc3RpdHV0aW9uLXN0YXR1cy1kZXRhaWxzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2luIGF0dGVtcHRzIHRoYXQgYXJlIHN1Y2Nlc3NmdWwsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHN1Y2Nlc3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbnMgdGhhdCBhcmUgZmFpbGluZyBkdWUgdG8gYW4gaW50ZXJuYWwgUGxhaWQgaXNzdWUsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9wbGFpZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpc3N1ZSBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIHN5c3RlbSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgZXJyb3JfaW5zdGl0dXRpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBIb3cgZnJlcXVlbnRseSBkYXRhIGZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMgbGlrZSBJbnZlc3RtZW50cywgVHJhbnNhY3Rpb25zLCBhbmQgTGlhYmlsaXRpZXMsIGlzIGJlaW5nIHJlZnJlc2hlZCwgcmVsYXRpdmUgdG8gdGhlIGluc3RpdHV0aW9uXFwncyBub3JtYWwgc2NoZWR1bGluZy4gVGhlIGByZWZyZXNoX2ludGVydmFsYCBtYXkgYmUgYERFTEFZRURgIG9yIGBTVE9QUEVEYCBldmVuIHdoZW4gdGhlIHN1Y2Nlc3MgcmF0ZSBpcyBoaWdoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICByZWZyZXNoX2ludGVydmFsPzogUHJvZHVjdFN0YXR1c0JyZWFrZG93blJlZnJlc2hJbnRlcnZhbEVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c0JyZWFrZG93blJlZnJlc2hJbnRlcnZhbEVudW0ge1xuICAgIE5vcm1hbCA9ICdOT1JNQUwnLFxuICAgIERlbGF5ZWQgPSAnREVMQVlFRCcsXG4gICAgU3RvcHBlZCA9ICdTVE9QUEVEJ1xufVxuXG4vKipcbiAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGFuIGluc3RpdHV0aW9uIGNhbiBzdXBwb3J0LiBBbGwgSXRlbXMgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiBUaGUgQmFsYW5jZSBwcm9kdWN0IGlzIGFsd2F5cyBhdmFpbGFibGUgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgc3BlY2lmaWVkIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RzIHtcbiAgICBBc3NldHMgPSAnYXNzZXRzJyxcbiAgICBBdXRoID0gJ2F1dGgnLFxuICAgIEJhbGFuY2UgPSAnYmFsYW5jZScsXG4gICAgQmFsYW5jZVBsdXMgPSAnYmFsYW5jZV9wbHVzJyxcbiAgICBCZWFjb24gPSAnYmVhY29uJyxcbiAgICBJZGVudGl0eSA9ICdpZGVudGl0eScsXG4gICAgSWRlbnRpdHlNYXRjaCA9ICdpZGVudGl0eV9tYXRjaCcsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEludmVzdG1lbnRzQXV0aCA9ICdpbnZlc3RtZW50c19hdXRoJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUGF5bWVudEluaXRpYXRpb24gPSAncGF5bWVudF9pbml0aWF0aW9uJyxcbiAgICBJZGVudGl0eVZlcmlmaWNhdGlvbiA9ICdpZGVudGl0eV92ZXJpZmljYXRpb24nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdERldGFpbHMgPSAnY3JlZGl0X2RldGFpbHMnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbiA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uJyxcbiAgICBTdGFuZGluZ09yZGVycyA9ICdzdGFuZGluZ19vcmRlcnMnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBFbXBsb3ltZW50ID0gJ2VtcGxveW1lbnQnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9ucyA9ICdyZWN1cnJpbmdfdHJhbnNhY3Rpb25zJyxcbiAgICBUcmFuc2FjdGlvbnNSZWZyZXNoID0gJ3RyYW5zYWN0aW9uc19yZWZyZXNoJyxcbiAgICBTaWduYWwgPSAnc2lnbmFsJyxcbiAgICBTdGF0ZW1lbnRzID0gJ3N0YXRlbWVudHMnLFxuICAgIFByb2Nlc3NvclBheW1lbnRzID0gJ3Byb2Nlc3Nvcl9wYXltZW50cycsXG4gICAgUHJvY2Vzc29ySWRlbnRpdHkgPSAncHJvY2Vzc29yX2lkZW50aXR5JyxcbiAgICBQcm9maWxlID0gJ3Byb2ZpbGUnLFxuICAgIENyYUJhc2VSZXBvcnQgPSAnY3JhX2Jhc2VfcmVwb3J0JyxcbiAgICBDcmFJbmNvbWVJbnNpZ2h0cyA9ICdjcmFfaW5jb21lX2luc2lnaHRzJyxcbiAgICBDcmFQYXJ0bmVySW5zaWdodHMgPSAnY3JhX3BhcnRuZXJfaW5zaWdodHMnLFxuICAgIENyYU5ldHdvcmtJbnNpZ2h0cyA9ICdjcmFfbmV0d29ya19pbnNpZ2h0cycsXG4gICAgQ3JhQ2FzaGZsb3dJbnNpZ2h0cyA9ICdjcmFfY2FzaGZsb3dfaW5zaWdodHMnLFxuICAgIExheWVyID0gJ2xheWVyJyxcbiAgICBQYXlCeUJhbmsgPSAncGF5X2J5X2JhbmsnXG59XG5cbi8qKlxuICogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBOZXR3b3JrU3RhdHVzR2V0VXNlcjtcbn1cbi8qKlxuICogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvZmlsZS9uZXR3b3JrX3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5ldHdvcmtfc3RhdHVzOiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmFsaWQgbmFtZSBtYXRjaGluZyBzZW5zaXRpdml0eSBjb25maWd1cmF0aW9ucyBmb3IgYSBzY3JlZW5pbmcgcHJvZ3JhbS4gTm90ZSB0aGF0IHdoaWxlIGNlcnRhaW4gbWF0Y2hpbmcgdGVjaG5pcXVlcyBtYXkgYmUgbW9yZSBwcmV2YWxlbnQgb24gbGVzcyBzdHJpY3Qgc2V0dGluZ3MsIGFsbCBtYXRjaGluZyBhbGdvcml0aG1zIGFyZSBlbmFibGVkIGZvciBldmVyeSBzZW5zaXRpdml0eS4gIGBjb2Fyc2VgIC0gU2VlIG1vcmUgcG90ZW50aWFsIG1hdGNoZXMuIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCBzZWUgbW9yZSBicm9hZCBwaG9uZXRpYyBtYXRjaGVzIGFjcm9zcyBhbHBoYWJldHMgdGhhdCBtYWtlIG1pc3NpbmcgYSBwb3RlbnRpYWwgaGl0IHZlcnkgdW5saWtlbHkuIFRoaXMgc2V0dGluZyBpcyBub2lzaWVyIGFuZCB3aWxsIHJlcXVpcmUgbW9yZSBtYW51YWwgcmV2aWV3LiAgYGJhbGFuY2VkYCAtIEEgZ29vZCBkZWZhdWx0IGZvciBtb3N0IGNvbXBhbmllcy4gVGhpcyBzZW5zaXRpdml0eSBpcyBiYWxhbmNlZCB0byBzaG93IGhpZ2ggcXVhbGl0eSBoaXRzIHdpdGggcmVkdWNlZCBub2lzZS4gIGBzdHJpY3RgIC0gQWdncmVzc2l2ZSBmYWxzZSBwb3NpdGl2ZSByZWR1Y3Rpb24uIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCByZXF1aXJlIG5hbWVzIHRvIGJlIG1vcmUgc2ltaWxhciB0aGFuIGBjb2Fyc2VgIGFuZCBgYmFsYW5jZWRgIHNldHRpbmdzLCByZWx5aW5nIGxlc3Mgb24gcGhvbmV0aWNzLCB3aGlsZSBzdGlsbCBhY2NvdW50aW5nIGZvciBjaGFyYWN0ZXIgdHJhbnNwb3NpdGlvbnMsIG1pc3NpbmcgdG9rZW5zLCBhbmQgb3RoZXIgY29tbW9uIHBlcm11dGF0aW9ucy4gIGBleGFjdGAgLSBNYXRjaGVzIG11c3QgYmUgbmVhcmx5IGV4YWN0LiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgb25seSBzaG93IGhpdHMgd2l0aCBleGFjdCBvciBuZWFybHkgZXhhY3QgbmFtZSBtYXRjaGVzIHdpdGggb25seSBiYXNpYyBjb3JyZWN0aW9uIHN1Y2ggYXMgZXh0cmFuZW91cyBzeW1ib2xzIGFuZCBjYXBpdGFsaXphdGlvbi4gVGhpcyBzZXR0aW5nIGlzIGdlbmVyYWxseSBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSBoYXZlIGEgdmVyeSBzcGVjaWZpYyB1c2UgY2FzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2dyYW1OYW1lU2Vuc2l0aXZpdHkge1xuICAgIENvYXJzZSA9ICdjb2Fyc2UnLFxuICAgIEJhbGFuY2VkID0gJ2JhbGFuY2VkJyxcbiAgICBTdHJpY3QgPSAnc3RyaWN0JyxcbiAgICBFeGFjdCA9ICdleGFjdCdcbn1cblxuLyoqXG4gKiBUaGUgZW1wbG95ZWVcXCdzIGVzdGltYXRlZCBhbm51YWwgc2FsYXJ5LCBhcyBkZXJpdmVkIGZyb20gaW5mb3JtYXRpb24gcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBuZXR3b3JrIHByb3h5IGlzIHByZXNlbnQgYW5kIGlmIHNvIHdoYXQgdHlwZSBpdCBpcy4gIGBub25lX2RldGVjdGVkYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgbm90IG9uIGEgZGV0ZWN0YWJsZSBwcm94eSBuZXR3b3JrLiAgYHRvcmAgaW5kaWNhdGVzIHRoZSB1c2VyIHdhcyB1c2luZyBhIFRvciBicm93c2VyLCB3aGljaCBzZW5kcyBlbmNyeXB0ZWQgdHJhZmZpYyBvbiBhIGRlY2VudHJhbGl6ZWQgbmV0d29yayBhbmQgaXMgc29tZXdoYXQgc2ltaWxhciB0byBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspLiAgYHZwbmAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgVlBOIChWaXJ0dWFsIFByaXZhdGUgTmV0d29yaykgIGB3ZWJfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIG1heSBhbGxvdyB0aGVtIHRvIGNvbmNlYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGVpciBJUCBhZGRyZXNzIG9yIG90aGVyIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgYHB1YmxpY19wcm94eWAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgcHVibGljIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gYSB3ZWIgcHJveHkgYnV0IGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdXNlcnMuIFRoaXMgbWF5IGFsbG93IG11bHRpcGxlIHVzZXJzIHRvIGFwcGVhciBhcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgSVAgYWRkcmVzcyBmb3IgaW5zdGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm94eVR5cGUge1xuICAgIE5vbmVEZXRlY3RlZCA9ICdub25lX2RldGVjdGVkJyxcbiAgICBUb3IgPSAndG9yJyxcbiAgICBWcG4gPSAndnBuJyxcbiAgICBXZWJQcm94eSA9ICd3ZWJfcHJveHknLFxuICAgIFB1YmxpY1Byb3h5ID0gJ3B1YmxpY19wcm94eSdcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCB3YXMgZmxhZ2dlZCBieSBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtLCBhbmQgcmVxdWlyZXMgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gdG8gZW5zdXJlIHRoZXkgYXJlIG5vdCBhIGJvdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9FUlJPUlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUkVDQVBUQ0hBX1JFUVVJUkVEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNDAwXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGh0dHBfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHNvbHZlIGEgR29vZ2xlIHJlQ0FQVENIQSBjaGFsbGVuZ2UgaW4gdGhlIExpbmsgUmVjYXB0Y2hhIHBhbmUuIElmIHRoZXkgc29sdmUgdGhlIGNoYWxsZW5nZSBzdWNjZXNzZnVsbHksIHRoZSB1c2VyXFwncyByZXF1ZXN0IGlzIHJlc3VibWl0dGVkIGFuZCB0aGV5IGFyZSBkaXJlY3RlZCB0byB0aGUgbmV4dCBJdGVtIGNyZWF0aW9uIHN0ZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGxpbmtfdXNlcl9leHBlcmllbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBkZXRlY3RzIGFidXNpdmUgdHJhZmZpYyBhbmQgY29uc2lkZXJzIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRocm91Z2hvdXQgSXRlbSBjcmVhdGlvbiByZXF1ZXN0cy4gV2hlbiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCByaXNreSBvciBwb3NzaWJseSBmcmF1ZHVsZW50LCBMaW5rIHByZXNlbnRzIGEgcmVDQVBUQ0hBIGZvciB0aGUgdXNlciB0byBzb2x2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgY29tbW9uX2NhdXNlczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpbmsgd2lsbCBhdXRvbWF0aWNhbGx5IGd1aWRlIHlvdXIgdXNlciB0aHJvdWdoIHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgaW5zdHJ1bWVudGluZyBiYXNpYyBmcmF1ZCBtb25pdG9yaW5nIHRvIGRldGVjdCBhbmQgcHJvdGVjdCB5b3VyIHdlYnNpdGUgZnJvbSBzcGFtIGFuZCBhYnVzZS4gIElmIHlvdXIgdXNlciBjYW5ub3QgdmVyaWZ5IHRoZWlyIHNlc3Npb24sIHBsZWFzZSBzdWJtaXQgYSBTdXBwb3J0IHRpY2tldCB3aXRoIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6IGBsaW5rX3Nlc3Npb25faWRgIG9yIGByZXF1ZXN0X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICB0cm91Ymxlc2hvb3Rpbmdfc3RlcHM6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHlvdSBuZWVkIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVjb21tZW5kYXRpb24gcmVzdWx0IGZvciB0aGF0IGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZWNvbW1lbmRhdGlvblN0cmluZyB7XG4gICAgUmVjb21tZW5kZWQgPSAnUkVDT01NRU5ERUQnLFxuICAgIE5vdFJlY29tbWVuZGVkID0gJ05PVF9SRUNPTU1FTkRFRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEluc2lnaHRzIHJlbGF0aW5nIHRvIGV4cGVuc2VzIGFuZCBkZXBvc2l0cyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gb2NjdXIgb24gYSBzY2hlZHVsZWQgYmFzaXMsIHN1Y2ggYXMgYml3ZWVrbHksIG1vbnRobHksIG9yIGFubnVhbGx5LiAgQ29tbW9uIGV4YW1wbGVzIGluY2x1ZGUgbG9hbiBwYXltZW50cywgYmlsbCBwYXltZW50cywgc3Vic2NyaXB0aW9ucywgYW5kIHBheXJvbGwgaW5jb21lLiAgVGhpcyBpcyBhIGJldGEgZmllbGQsIGF2YWlsYWJsZSB0byBhbGwgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdHJhbnNhY3Rpb24gaXMgcGVyaW9kaWNhbGx5IHJlY3VycmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyZW5jZVxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmVuY2VcbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNhbmNlbGxlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19DQU5DRUxMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYFdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgd2Vlay4gIGBCSVdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgMiB3ZWVrcy4gIGBTRU1JX01PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IHR3aWNlIHBlciBtb250aC4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zLiAgYE1PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IG1vbnRoLiAgYEFOTlVBTExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB5ZWFyLiAgYERBSUxZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBkYXkuICBgRFlOQU1JQ2A6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgdmFyaWVzIGluIHJlY3VycmVuY2UgZnJlcXVlbmN5LiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHN0cmVhbXMgaW4gdGhlIGdpZyBlY29ub215LiAgYFVOS05PV05gOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IGlzblxcJ3QgcmVjdXJyaW5nIGluIG5hdHVyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ0ZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgRHluYW1pYyA9ICdEWU5BTUlDJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW0ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudC1wcm92aWRlZCByYXcgZGVzY3JpcHRpb24gb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgb3IgcHJpbWFyeSBjb3VudGVycGFydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gZWFjaCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19hcGFydDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgbmV3IHRyYW5zZmVyIG9mIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIG9yaWdpbmF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfTkVXX1RSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBkb2VzIG5vdCBmaXQgYW55IG9mIHRoZSBwcmUtZGVmaW5lZCBmcmVxdWVuY2llcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBlbmRwb2ludFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBpbmNvbWUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBzdWJzY3JpcHRpb25zLCBiaWxscywgbG9hbiBwYXltZW50cykuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIGZvciBhY2NvdW50cyB0aGF0IGhhdmUgbmV3IG9yIHVwZGF0ZWQgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gIFRoZSBuZXh0IHRyYW5zZmVyIG9yaWdpbmF0aW9uIGRhdGUgYWZ0ZXIgYmFuayBob2xpZGF5IGFkanVzdG1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiAgVGhlIG5leHQgdHJhbnNmZXIgb3JpZ2luYXRpb24gZGF0ZSBhZnRlciBiYW5rIGhvbGlkYXkgYWRqdXN0bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIG9uIHRoZSBwbGFubmVkIGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNGRVJfU0tJUFBFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlX2NvZGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYW5uZWQgZGF0ZSBvbiB3aGljaCBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgc2tpcHBlZF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSByZW1vdmVkIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcG9ydCB0eXBlLiBJdCBjYW4gYmUgYGFzc2V0YC4gSW5jb21lIHJlcG9ydCB0eXBlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZXBvcnRUeXBlIHtcbiAgICBBc3NldCA9ICdhc3NldCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGJlaGF2aW9yYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2ssIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0JlaGF2aW9yIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgdXNlcl9pbnRlcmFjdGlvbnM6IFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgZnJhdWRfcmluZ19kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgYm90X2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbFdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbFdpdGhOb0RhdGE7XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBib3QgZGV0ZWN0aW9uIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGZyYXVkIHJpbmcgYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG92ZXJhbGwgdXNlciBpbnRlcmFjdGlvbiBzaWduYWxzIG9mIGEgYmVoYXZpb3IgcmlzayBjaGVjay4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIGhvdyBmYW1pbGlhciB0aGUgdXNlciBpcyB3aXRoIHRoZSBwZXJzb25hbCBkYXRhIHRoZXkgcHJvdmlkZSwgYmFzZWQgb24gYSBudW1iZXIgb2Ygc2lnbmFscyB0aGF0IGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHRoZWlyIHNlc3Npb24uICBgZ2VudWluZWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBoaWdoIGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyB1bmxpa2VseS4gIGBuZXV0cmFsYCBpbmRpY2F0ZXMgc29tZSBzaWduYWxzIGFyZSBwcmVzZW50IGluIGJldHdlZW4gYHJpc2t5YCBhbmQgYGdlbnVpbmVgLCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2xlYXIgc2lnbmFscyB0byBkZXRlcm1pbmUgYW4gb3V0Y29tZS4gIGByaXNreWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBsb3cgZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIGxpa2VseS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbCB7XG4gICAgR2VudWluZSA9ICdnZW51aW5lJyxcbiAgICBOZXV0cmFsID0gJ25ldXRyYWwnLFxuICAgIFJpc2t5ID0gJ3Jpc2t5JyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYmVoYXZpb3I6IFJpc2tDaGVja0JlaGF2aW9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbDogUmlza0NoZWNrRW1haWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tQaG9uZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lOiBSaXNrQ2hlY2tQaG9uZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmVzdWx0IHN1bW1hcnkgb2JqZWN0cyBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tEZXZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGV2aWNlczogQXJyYXk8Umlza0NoZWNrRGV2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZGVudGl0eV9hYnVzZV9zaWduYWxzOiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogUmlza0NoZWNrTmV0d29yayB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm94eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3Byb3h5X3R5cGU6IFByb3h5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2Ygc3BhbSBsaXN0cyB0aGUgSVAgYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfc3BhbV9saXN0X2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVUQyBvZmZzZXQgb2YgdGhlIHRpbWV6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVAgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF90aW1lem9uZV9vZmZzZXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgZW1haWxgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRW1haWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBpc19kZWxpdmVyYWJsZTogUmlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIENvdW50IG9mIGFsbCBrbm93biBicmVhY2hlcyBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBicmVhY2hfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZmlyc3RfYnJlYWNoZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgbGFzdF9icmVhY2hlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5fcmVnaXN0ZXJlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfZnJlZV9wcm92aWRlcjogUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfY3VzdG9tOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfZGlzcG9zYWJsZTogUmlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgdG9wX2xldmVsX2RvbWFpbl9pc19zdXNwaWNpb3VzOiBSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBlbWFpbCBhZGRyZXNzIGhhcyBiZWVuIGRldGVjdGVkIHRvIGhhdmUgYWNjb3VudHMgb3Igb3RoZXIgYWN0aXZpdHkuXG4gICAgICogQHR5cGUge1NldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsaW5rZWRfc2VydmljZXM6IFNldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGN1c3RvbSBpZiBrbm93biwgaS5lLiBhIGNvbXBhbnkgZG9tYWluIGFuZCBub3QgZnJlZSBvciBkaXNwb3NhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBkb21haW4gaXMgbGlzdGVkIGFzIGRpc3Bvc2FibGUgaWYga25vd24uIERpc3Bvc2FibGUgZG9tYWlucyBhcmUgb2Z0ZW4gdXNlZCB0byBjcmVhdGUgZW1haWwgYWRkcmVzc2VzIHRoYXQgYXJlIHBhcnQgb2YgYSBmYWtlIHNldCBvZiB1c2VyIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGRvbWFpbiBpcyBhIGZyZWUgcHJvdmlkZXIgc3VjaCBhcyBHbWFpbCBvciBIb3RtYWlsIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlciB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFNNVFAtTVggY2hlY2sgdG8gY29uZmlybSB0aGUgZW1haWwgYWRkcmVzcyBleGlzdHMgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyB0b3AgbGV2ZWwgZG9tYWluLCB3aGljaCBpcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBkb21haW4sIGlzIGZyYXVkdWxlbnQgb3Igcmlza3kgaWYga25vd24uIEluIG1vc3QgY2FzZXMsIGEgc3VzcGljaW91cyB0b3AgbGV2ZWwgZG9tYWluIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIGEgZGlzcG9zYWJsZSBvciBoaWdoLXJpc2sgZG9tYWluLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBjYXB0dXJpbmcgYWJ1c2Ugc2lnbmFscyByZWxhdGVkIHRvIGBpZGVudGl0eSBhYnVzZWAsIGUuZy4gc3RvbGVuIGFuZCBzeW50aGV0aWMgaWRlbnRpdHkgZnJhdWQuIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBVUyBpZGVudGl0aWVzIGFuZCBzb21lIHNpZ25hbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIHdoYXQgaW5mb3JtYXRpb24gd2FzIGNvbGxlY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN5bnRoZXRpY19pZGVudGl0eTogUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAgICAgKi9cbiAgICBzdG9sZW5faWRlbnRpdHk6IFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgbGlua2VkIHNlcnZpY2UuIE5vdGUgdGhhdCBgYWR1bHRfc2l0ZXNgIHJlZmVyc1xcJyB0byBleHBsaWNpdCB2aWRlbyBjb250ZW50LCBhbmQgaW5jbHVkZXMgYSBudW1iZXIgb2YgcmVsYXRlZCBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0xpbmtlZFNlcnZpY2Uge1xuICAgIEFib3V0bWUgPSAnYWJvdXRtZScsXG4gICAgQWRvYmUgPSAnYWRvYmUnLFxuICAgIEFkdWx0U2l0ZXMgPSAnYWR1bHRfc2l0ZXMnLFxuICAgIEFpcmJuYiA9ICdhaXJibmInLFxuICAgIEFsdGJhbGFqaSA9ICdhbHRiYWxhamknLFxuICAgIEFtYXpvbiA9ICdhbWF6b24nLFxuICAgIEFwcGxlID0gJ2FwcGxlJyxcbiAgICBBcmNoaXZlb3JnID0gJ2FyY2hpdmVvcmcnLFxuICAgIEF0bGFzc2lhbiA9ICdhdGxhc3NpYW4nLFxuICAgIEJpdG1vamkgPSAnYml0bW9qaScsXG4gICAgQm9keWJ1aWxkaW5nID0gJ2JvZHlidWlsZGluZycsXG4gICAgQm9va2luZyA9ICdib29raW5nJyxcbiAgICBCdWthbGFwYWsgPSAnYnVrYWxhcGFrJyxcbiAgICBDb2RlY2FkZW15ID0gJ2NvZGVjYWRlbXknLFxuICAgIERlbGl2ZXJvbyA9ICdkZWxpdmVyb28nLFxuICAgIERpaWdvID0gJ2RpaWdvJyxcbiAgICBEaXNjb3JkID0gJ2Rpc2NvcmQnLFxuICAgIERpc25leXBsdXMgPSAnZGlzbmV5cGx1cycsXG4gICAgRHVvbGluZ28gPSAnZHVvbGluZ28nLFxuICAgIEViYXkgPSAnZWJheScsXG4gICAgRW52YXRvID0gJ2VudmF0bycsXG4gICAgRXZlbnRicml0ZSA9ICdldmVudGJyaXRlJyxcbiAgICBFdmVybm90ZSA9ICdldmVybm90ZScsXG4gICAgRmFjZWJvb2sgPSAnZmFjZWJvb2snLFxuICAgIEZpcmVmb3ggPSAnZmlyZWZveCcsXG4gICAgRmxpY2tyID0gJ2ZsaWNrcicsXG4gICAgRmxpcGthcnQgPSAnZmxpcGthcnQnLFxuICAgIEZvdXJzcXVhcmUgPSAnZm91cnNxdWFyZScsXG4gICAgRnJlZWxhbmNlciA9ICdmcmVlbGFuY2VyJyxcbiAgICBHYWFuYSA9ICdnYWFuYScsXG4gICAgR2lwaHkgPSAnZ2lwaHknLFxuICAgIEdpdGh1YiA9ICdnaXRodWInLFxuICAgIEdvb2dsZSA9ICdnb29nbGUnLFxuICAgIEdyYXZhdGFyID0gJ2dyYXZhdGFyJyxcbiAgICBIdWJzcG90ID0gJ2h1YnNwb3QnLFxuICAgIEltZ3VyID0gJ2ltZ3VyJyxcbiAgICBJbnN0YWdyYW0gPSAnaW5zdGFncmFtJyxcbiAgICBKZGlkID0gJ2pkaWQnLFxuICAgIEtha2FvID0gJ2tha2FvJyxcbiAgICBLb21tbyA9ICdrb21tbycsXG4gICAgS29tb290ID0gJ2tvbW9vdCcsXG4gICAgTGFzdGZtID0gJ2xhc3RmbScsXG4gICAgTGF6YWRhID0gJ2xhemFkYScsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBMaW5rZWRpbiA9ICdsaW5rZWRpbicsXG4gICAgTWFpbHJ1ID0gJ21haWxydScsXG4gICAgTWljcm9zb2Z0ID0gJ21pY3Jvc29mdCcsXG4gICAgTXlzcGFjZSA9ICdteXNwYWNlJyxcbiAgICBOZXRmbGl4ID0gJ25ldGZsaXgnLFxuICAgIE5pa2UgPSAnbmlrZScsXG4gICAgT2sgPSAnb2snLFxuICAgIFBhdHJlb24gPSAncGF0cmVvbicsXG4gICAgUGludGVyZXN0ID0gJ3BpbnRlcmVzdCcsXG4gICAgUGx1cmsgPSAncGx1cmsnLFxuICAgIFF1b3JhID0gJ3F1b3JhJyxcbiAgICBRem9uZSA9ICdxem9uZScsXG4gICAgUmFtYmxlciA9ICdyYW1ibGVyJyxcbiAgICBSYXBwaSA9ICdyYXBwaScsXG4gICAgUmVwbGl0ID0gJ3JlcGxpdCcsXG4gICAgU2Ftc3VuZyA9ICdzYW1zdW5nJyxcbiAgICBTZW9jbGVya3MgPSAnc2VvY2xlcmtzJyxcbiAgICBTaG9wY2x1ZXMgPSAnc2hvcGNsdWVzJyxcbiAgICBTa3lwZSA9ICdza3lwZScsXG4gICAgU25hcGNoYXQgPSAnc25hcGNoYXQnLFxuICAgIFNuYXBkZWFsID0gJ3NuYXBkZWFsJyxcbiAgICBTb3VuZGNsb3VkID0gJ3NvdW5kY2xvdWQnLFxuICAgIFNwb3RpZnkgPSAnc3BvdGlmeScsXG4gICAgU3RhcnogPSAnc3RhcnonLFxuICAgIFN0cmF2YSA9ICdzdHJhdmEnLFxuICAgIFRhcmluZ2EgPSAndGFyaW5nYScsXG4gICAgVGVsZWdyYW0gPSAndGVsZWdyYW0nLFxuICAgIFRpa2kgPSAndGlraScsXG4gICAgVG9rb3BlZGlhID0gJ3Rva29wZWRpYScsXG4gICAgVHJlZWhvdXNlID0gJ3RyZWVob3VzZScsXG4gICAgVHVtYmxyID0gJ3R1bWJscicsXG4gICAgVHdpdHRlciA9ICd0d2l0dGVyJyxcbiAgICBWZW5tbyA9ICd2ZW5tbycsXG4gICAgVmliZXIgPSAndmliZXInLFxuICAgIFZpbWVvID0gJ3ZpbWVvJyxcbiAgICBWaXZpbm8gPSAndml2aW5vJyxcbiAgICBWa29udGFrdGUgPSAndmtvbnRha3RlJyxcbiAgICBXYXR0cGFkID0gJ3dhdHRwYWQnLFxuICAgIFdlaWJvID0gJ3dlaWJvJyxcbiAgICBXaGF0c2FwcCA9ICd3aGF0c2FwcCcsXG4gICAgV29yZHByZXNzID0gJ3dvcmRwcmVzcycsXG4gICAgWGluZyA9ICd4aW5nJyxcbiAgICBZYWhvbyA9ICd5YWhvbycsXG4gICAgWWFuZGV4ID0gJ3lhbmRleCcsXG4gICAgWmFsbyA9ICd6YWxvJyxcbiAgICBab2hvID0gJ3pvaG8nXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBuZXR3b3JrIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrTmV0d29ya1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja05ldHdvcmsge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja05ldHdvcmtcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrTmV0d29ya1xuICAgICAqL1xuICAgIGZhY3RvcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYHBob25lYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBwaG9uZSBudW1iZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGZhY3RvcnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN0b2xlbiBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN5bnRoZXRpYyBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTeW50aGV0aWNGcmF1ZH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICBmaXJzdF9wYXJ0eV9zeW50aGV0aWNfZnJhdWQ/OiBTeW50aGV0aWNGcmF1ZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N5bnRoZXRpY0ZyYXVkfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3N5bnRoZXRpY19mcmF1ZD86IFN5bnRoZXRpY0ZyYXVkIHwgbnVsbDtcbn1cbi8qKlxuICogUmlzayBsZXZlbCBmb3IgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tMZXZlbCB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJ1xufVxuXG4vKipcbiAqIFJpc2sgbGV2ZWwgZm9yIHRoZSBnaXZlbiByaXNrIGNoZWNrIHR5cGUsIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0xldmVsV2l0aE5vRGF0YSB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSaXNrUHJvZmlsZSBpcyBkZXByZWNhdGVkLCB1c2UgYHJ1bGVzZXRgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tQcm9maWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1Byb2ZpbGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIHJpc2sgcHJvZmlsZSB1c2VkIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAga2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBsaXN0IG9mIG91dGNvbWVzLCBzdWNoIGFzIFxcXCJhY2NlcHRcXFwiLCBcXFwicmV2aWV3XFxcIiwgYW5kIFxcXCJkZWNsaW5lXFxcIiB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgYSBjb2RlIGFuZCBkZXNjcmlwdGlvbiB0byBkZXNjcmliZSBtZWRpdW0gcmlzayB0cmFuc2FjdGlvbnMgYW5kIGFib3ZlIG9uIC9hY2NvdW50cy9iYWxhbmNlL2dldC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1JlYXNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tSZWFzb24ge1xuICAgIC8qKlxuICAgICAqIEEgY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgcmlzayBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiAgVGhlIGNvZGVzIGFyZSBmcm9tIFBMMDEgdG8gUEwwOCBhbmQgZnJvbSBCSzAxIHRvIEJLMDcuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiByaXNrIHJlYXNvbiBjb2Rlcywgc2VlIFtSaXNrIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNyaXNrLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrUmVhc29uXG4gICAgICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZXhwbGFpbmluZyB0aGUgcmlzayBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gYW5kIHNvbWUgcmVjb21tZW5kZWQgYWN0aW9ucy4gVGhpcyBmaWVsZCBpcyBzdWJqZWN0IHRvIGNoYW5nZTsgYW55IHByb2dyYW1tYXRpYyBsb2dpYyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGBjb2RlYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tSZWFzb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBmb3IgdGhlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgc3RhdHVzPzogUmlza1NpZ25hbERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlPzogUmlza1NpZ25hbERvY3VtZW50VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxGaWxlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZmlsZV90eXBlPzogUmlza1NpZ25hbEZpbGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogVHlwZSBvZiBhIGRvY3VtZW50IGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbERvY3VtZW50VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBCYW5rU3RhdGVtZW50ID0gJ0JBTktfU1RBVEVNRU5UJyxcbiAgICBCZW5lZml0c1N0YXRlbWVudCA9ICdCRU5FRklUU19TVEFURU1FTlQnLFxuICAgIEJ1c2luZXNzRmlsaW5nID0gJ0JVU0lORVNTX0ZJTElORycsXG4gICAgQ2hlY2sgPSAnQ0hFQ0snLFxuICAgIERyaXZpbmdMaWNlbnNlID0gJ0RSSVZJTkdfTElDRU5TRScsXG4gICAgRmluYW5jaWFsU3RhdGVtZW50ID0gJ0ZJTkFOQ0lBTF9TVEFURU1FTlQnLFxuICAgIEludm9pY2UgPSAnSU5WT0lDRScsXG4gICAgUGF5c2xpcCA9ICdQQVlTTElQJyxcbiAgICBTb2NpYWxTZWN1cml0eUNhcmQgPSAnU09DSUFMX1NFQ1VSSVRZX0NBUkQnLFxuICAgIFRheEZvcm0gPSAnVEFYX0ZPUk0nLFxuICAgIFV0aWxpdHlCaWxsID0gJ1VUSUxJVFlfQklMTCdcbn1cblxuLyoqXG4gKiBUaGUgZmlsZSB0eXBlIGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbEZpbGVUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEltYWdlUGRmID0gJ0lNQUdFX1BERicsXG4gICAgU2Nhbk9jciA9ICdTQ0FOX09DUicsXG4gICAgVHJ1ZVBkZiA9ICdUUlVFX1BERicsXG4gICAgSW1hZ2UgPSAnSU1BR0UnLFxuICAgIE1peGVkUGFnZVBkZiA9ICdNSVhFRF9QQUdFX1BERicsXG4gICAgRW1wdHlQZGYgPSAnRU1QVFlfUERGJyxcbiAgICBGbGF0dGVuZWRQZGYgPSAnRkxBVFRFTkVEX1BERidcbn1cblxuLyoqXG4gKiBBRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVEZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIFJvbGVcbiAgICAgKi9cbiAgICBST0xFX0RFVEFJTDogUm9sZURldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlRGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5Um9sZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJvbGVEZXRhaWxcbiAgICAgKi9cbiAgICBQYXJ0eVJvbGVUeXBlOiBQYXJ0eVJvbGVUeXBlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJvbGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlc1xuICAgICAqL1xuICAgIFJPTEU6IFJvbGU7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHRyYW5zYWN0aW9uIHJlc3VsdCBhZnRlciBldmFsdWF0ZWQgYnkgdGhlIHJlcXVlc3RlZCBSdWxlc2V0LiBJZiBhIGBydWxlc2V0X2tleWAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJ1bGVzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlc2V0IHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBSdWxlc2V0IHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBsaXN0IG9mIG91dGNvbWVzLCBzdWNoIGFzIFxcXCJhY2NlcHRcXFwiLCBcXFwicmV2aWV3XFxcIiwgYW5kIFxcXCJkZWNsaW5lXFxcIiB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVzZXRcbiAgICAgKi9cbiAgICBvdXRjb21lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTTVNWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTTVNWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTTVNWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogU01TVmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdHRlbXB0IGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgU01TIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlbGl2ZXJ5IGF0dGVtcHRzIG1hZGUgd2l0aGluIHRoZSB2ZXJpZmljYXRpb24gdG8gc2VuZCB0aGUgU01TIGNvZGUgdG8gdGhlIHVzZXIuIEVhY2ggZGVsaXZlcnkgYXR0ZW1wdCByZXByZXNlbnRzIHRoZSB1c2VyIHRha2luZyBhY3Rpb24gZnJvbSB0aGUgZnJvbnQgZW5kIFVJIHRvIHJlcXVlc3QgY3JlYXRpb24gYW5kIGRlbGl2ZXJ5IG9mIGEgbmV3IFNNUyB2ZXJpZmljYXRpb24gY29kZSwgb3IgdG8gcmVzZW5kIGFuIGV4aXN0aW5nIFNNUyB2ZXJpZmljYXRpb24gY29kZS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIGRlbGl2ZXJ5IGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZGVsaXZlcnlfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgbWFkZSBieSB0aGUgdXNlciB3aXRoaW4gdGhlIHZlcmlmaWNhdGlvbiB0byB2ZXJpZnkgdGhlIFNNUyBjb2RlIGJ5IGVudGVyaW5nIGl0IGludG8gdGhlIGZyb250IGVuZCBVSS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIHNvbHZlIGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc29sdmVfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpbml0aWFsbHlfc2VudF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9zZW50X2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU01TVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnXG59XG5cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuIElmIHByb3ZpZGVkLCB0aGlzIHdpbGwgb3ZlcnJpZGUgdGhlIFVSTCBzZXQgaW4gdGhlIGRhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfb3ZlcnJpZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19maWVsZHM6IFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcztcbn1cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBjb2RlcyB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHRlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGUge1xuICAgIFVwZGF0ZSA9ICdCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURScsXG4gICAgQ29tcGxldGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9DT01QTEVURSdcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBmaWVsZHMgd2hpY2ggd2lsbCBiZSBwb3B1bGF0ZWQgaW4gdGhlIHNpbXVsYXRlZCB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYGZhaWxlZGAsIG9yIGByZXZlcnNlZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBwZW5kaW5nYCAtLT4gYGZhaWxlZGAgIGBwZW5kaW5nYCAtLT4gYHBvc3RlZGAgIGBwb3N0ZWRgIC0tPiBgcmV2ZXJzZWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBzYW5kYm94L2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBXZWJob29rVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBjb2RlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtIHtcbiAgICBEZWZhdWx0VXBkYXRlID0gJ0RFRkFVTFRfVVBEQVRFJyxcbiAgICBOZXdBY2NvdW50c0F2YWlsYWJsZSA9ICdORVdfQUNDT1VOVFNfQVZBSUxBQkxFJyxcbiAgICBTbXNNaWNyb2RlcG9zaXRzVmVyaWZpY2F0aW9uID0gJ1NNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTicsXG4gICAgQXV0aG9yaXphdGlvbkdyYW50ZWQgPSAnQVVUSE9SSVpBVElPTl9HUkFOVEVEJyxcbiAgICBQZW5kaW5nRGlzY29ubmVjdCA9ICdQRU5ESU5HX0RJU0NPTk5FQ1QnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZSA9ICdSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURScsXG4gICAgTG9naW5SZXBhaXJlZCA9ICdMT0dJTl9SRVBBSVJFRCcsXG4gICAgU3luY1VwZGF0ZXNBdmFpbGFibGUgPSAnU1lOQ19VUERBVEVTX0FWQUlMQUJMRScsXG4gICAgUHJvZHVjdFJlYWR5ID0gJ1BST0RVQ1RfUkVBRFknLFxuICAgIEVycm9yID0gJ0VSUk9SJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBpcyBgdHJ1ZWAgIGlmIHRoZSB0ZXN0YCB3ZWJob29rX2NvZGVgICB3YXMgc3VjY2Vzc2Z1bGx5IGZpcmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rX2ZpcmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXNldF9sb2dpbjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB3aG9zZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHRvIGJlIG1vZGlmaWVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIHRvIHNldCB0aGUgYWNjb3VudCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHNhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIG9hdXRoX3N0YXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdG8gc2ltdWxhdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIHRvIHNldCB0aGUgcGF5bWVudCB0by4gICBWYWxpZCBzdGF0dXNlcyBpbmNsdWRlOiAtIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgIC0gYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2AgLSBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAgLSBgUEFZTUVOVF9TVEFUVVNfU0VUVExFRGAgLSBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIHNldCBvZiBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb25maWd1cmluZyB0aGUgSXRlbS4gSWYgc3BlY2lmaWVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcHJvY2Vzc29yIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgYC9wcm9jZXNzb3IvYCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdlYmhvb2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb247XG59XG4vKipcbiAqIEEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gb3B0aW9ucy4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHN0YXRlbWVudHMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggc3RhdGVtZW50cyBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCBzdGF0ZW1lbnRzIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9ucyBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZS4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgb25seSB0aGUgcGVuZGluZyBiYWxhbmNlIHRoYXQgaXMgZHVlIGJlZm9yZSB0aGUgYHZpcnR1YWxfdGltZXN0YW1wYCBvbiB0aGUgdGVzdCBjbG9jayB3aWxsIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGByZWZ1bmQucG9zdGVkYCwgYHJlZnVuZC5zZXR0bGVkYCwgYHJlZnVuZC5mYWlsZWRgLCBvciBgcmVmdW5kLnJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcmVmdW5kIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQuZmFpbGVkYCAgYHJlZnVuZC5wZW5kaW5nYCAtLT4gYHJlZnVuZC5wb3N0ZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQucmV0dXJuZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQuc2V0dGxlZGAgIGByZWZ1bmQucG9zdGVkYCBldmVudHMgY2FuIG9ubHkgYmUgc2ltdWxhdGVkIGlmIHRoZSByZWZ1bmRlZCB0cmFuc2ZlciBoYXMgYmVlbiB0cmFuc2l0aW9uZWQgdG8gc2V0dGxlZC4gVGhpcyBtaW1pY3MgdGhlIG9yZGVyaW5nIG9mIGV2ZW50cyBpbiBQcm9kdWN0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBgZnVuZHNfYXZhaWxhYmxlYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmZXIgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHBlbmRpbmdgIC0tPiBgZmFpbGVkYCAgYHBlbmRpbmdgIC0tPiBgcG9zdGVkYCAgYHBvc3RlZGAgLS0+IGByZXR1cm5lZGAgIGBwb3N0ZWRgIC0tPiBgc2V0dGxlZGAgIGBzZXR0bGVkYCAtLT4gYGZ1bmRzX2F2YWlsYWJsZWAgKG9ubHkgYXBwbGljYWJsZSB0byBBQ0ggZGViaXRzLikgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBzd2VlcCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBvbiB0aGUgZGF5IG9mIHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgYHRlc3RfY2xvY2tgLiBJZiB0aGUgZGF0ZSBvZiBgdmlydHVhbF90aW1lYCBpcyBvbiB3ZWVrZW5kIG9yIGEgZmVkZXJhbCBob2xpZGF5LCB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaXMgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpbXVsYXRlZFRyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwPzogU2ltdWxhdGVkVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRpbWVzdGFtcCB3aWxsIGJlIHVzZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrczogQXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBiZSByZXNldC4gIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gcmVzZXR0aW5nIGFsbCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbmRpY2F0b3IgZm9yIHdoZW4gc2NvcGVzIGFyZSBiZWluZyB1cGRhdGVkLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCB2aWEgZW5yb2xsbWVudCAoaS5lLiBPQXV0aCksIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgRU5ST0xMTUVOVGAuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGluIGEgcG9zdC1lbnJvbGxtZW50IHZpZXcsIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgUE9SVEFMYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNjb3Blc0NvbnRleHQge1xuICAgIEVucm9sbG1lbnQgPSAnRU5ST0xMTUVOVCcsXG4gICAgUG9ydGFsID0gJ1BPUlRBTCdcbn1cblxuLyoqXG4gKiBUaGUgc2NvcGVzIG9iamVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY29wZXNOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcm9kdWN0X2FjY2Vzcz86IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBY2Nlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgd2h5IGEgc2NyZWVuaW5nIGhpdCBtYXRjaGVkIHRoZSBwcm92aWRlZCB1c2VyIGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVzX29mX2JpcnRoPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZXM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gc2NyZWVuaW5nIGhpdHMgYXJlIGltbXV0YWJsZSBvbmNlIHRoZXkgaGF2ZSBiZWVuIHJldmlld2VkLiBJZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBkdWUgdG8gdXBkYXRlcyB0byB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIHNjcmVlbmluZyBoaXQgd2lsbCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhvc2UgY2hhbmdlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtc192ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRGF0ZXMgb2YgYmlydGggYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IEFycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT47XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZGF0ZSBvZiBiaXJ0aCBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGVSYW5nZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgZGF0YT86IERhdGVSYW5nZTtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQ7XG59XG4vKipcbiAqIEFuYWx5emVkIG5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGluZGl2aWR1YWwgc2NyZWVuaW5nIHN0YXR1cyBoYXMgY2hhbmdlZCwgd2hpY2ggY2FuIG9jY3VyIG1hbnVhbGx5IHZpYSB0aGUgZGFzaGJvYXJkIG9yIGR1cmluZyBvbmdvaW5nIG1vbml0b3JpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTQ1JFRU5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc2VjdXJpdHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGN1c2lwOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2Vkb2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBnaXZlbiB0byB0aGUgc2VjdXJpdHkgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWRgIGlzIHByZXNlbnQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBQbGFpZCBgaW5zdGl0dXRpb25faWRgIG9mIHRoZSBpbnN0aXR1dGlvbiB0byB3aG9tIHRoZSBpZGVudGlmaWVyIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCBQbGFpZCB3aWxsIHByb3ZpZGUgdGhlIElEIG9mIGFub3RoZXIgc2VjdXJpdHkgd2hvc2UgcGVyZm9ybWFuY2UgcmVzZW1ibGVzIHRoaXMgc2VjdXJpdHksIHR5cGljYWxseSB3aGVuIHRoZSBvcmlnaW5hbCBzZWN1cml0eSBoYXMgbG93IHZvbHVtZSwgb3Igd2hlbiBhIHByaXZhdGUgc2VjdXJpdHkgY2FuIGJlIG1vZGVsZWQgd2l0aCBhIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHByb3h5X3NlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgYSBzZWN1cml0eSBpcyBhIGhpZ2hseSBsaXF1aWQgYXNzZXQgYW5kIGNhbiBiZSB0cmVhdGVkIGxpa2UgY2FzaC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc19jYXNoX2VxdWl2YWxlbnQ6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiAgSW4gcmFyZSBpbnN0YW5jZXMsIGEgbnVsbCB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIGluc3RpdHV0aW9uYWwgZGF0YSBpcyBpbnN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBzZWN1cml0eSB0eXBlLiAgVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdG9yIGNsYXNzaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSwgc3VjaCBhcyBGaW5hbmNlLCBIZWFsdGggVGVjaG5vbG9neSwgZXRjLiAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMsIHBsZWFzZSByZWZlciB0byB0aGUgW1xcXCJTZWN0b3JzIGFuZCBJbmR1c3RyaWVzXFxcIiBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUw3YVhVZHFMaHhnTThxZTdoSzY3cXFLWGlVZFFxSUxwd1owTHB4dkNWbmMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdG9yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmR1c3RyeSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHksIHN1Y2ggYXMgQmlvdGVjaG5vbG9neSwgQWlybGluZXMsIGV0Yy4gIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtcXFwiU2VjdG9ycyBhbmQgSW5kdXN0cmllc1xcXCIgc3ByZWFkc2hlZXRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFMN2FYVWRxTGh4Z004cWU3aEs2N3FxS1hpVWRRcUlMcHdaMExweHZDVm5jKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluZHVzdHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcHRpb25Db250cmFjdH1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBvcHRpb25fY29udHJhY3Q6IE9wdGlvbkNvbnRyYWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rml4ZWRJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgZml4ZWRfaW5jb21lOiBGaXhlZEluY29tZSB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2UgW3JlcXVlc3QgSVNJTi9DVVNJUCBhY2Nlc3MgaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNpbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIFtyZXF1ZXN0IElTSU4vQ1VTSVAgYWNjZXNzIGhlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGZpZUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzTGl2ZW5lc3NDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsaXZlbmVzc19jaGVjazogU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc1xuICAgICAqL1xuICAgIGZhY2lhbF9hbmFseXNpcz86IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXMgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzZWxmaWUgYW5kIHRoZSBkb2N1bWVudCAoaWYgZG9jdW1lbnRhcnkgdmVyaWZpY2F0aW9uIGFsc28gcmFuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBvZiB0aGUgZmFjaWFsIGZlYXR1cmVzIG9mIHRoZSBzZWxmaWUgd2hlbiBjb21wYXJlZCB0byB0aGUgZmFjZSBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQsIGlmIG9uZSBpcyBwcmVzZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9leWU6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIHJpZ2h0X2V5ZTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICByaWdodF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBmb3JlaGVhZDogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbWlkZGxlX2ZvcmVoZWFkOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBub3NlOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaGlsdHJ1bTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbW91dGg6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIGphdzogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9jaGVlazogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgcmlnaHRfY2hlZWs6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xufVxuLyoqXG4gKiBPdXRjb21lIG9mIHRoZSBmYWNpYWwgYW5hbHlzaXMgZm9yIGEgc3BlY2lmaWMgZmFjaWFsIGZlYXR1cmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFzc2Vzc21lbnQgb2Ygd2hldGhlciB0aGUgc2VsZmllIGNhcHR1cmUgaXMgb2YgYSByZWFsIGh1bWFuIGJlaW5nLCBhcyBvcHBvc2VkIHRvIGEgcGljdHVyZSBvZiBhIGh1bWFuIG9uIGEgc2NyZWVuLCBhIHBpY3R1cmUgb2YgYSBwYXBlciBjdXQgb3V0LCBzb21lb25lIHdlYXJpbmcgYSBtYXNrLCBvciBhIGRlZXBmYWtlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogVGhlIGltYWdlIG9yIHZpZGVvIGNhcHR1cmUgb2YgYSBzZWxmaWUuIE9ubHkgb25lIG9mIGltYWdlIG9yIHZpZGVvIFVSTCB3aWxsIGJlIHBvcHVsYXRlZCBwZXIgc2VsZmllLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDYXB0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYW4gaW1hZ2Ugc2VsZmllIGNhcHR1cmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2FwdHVyZVxuICAgICAqL1xuICAgIGltYWdlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIGZvciBkb3dubG9hZGluZyBhIHZpZGVvIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICB2aWRlb191cmw6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMuc2VsZmllX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZUNoZWNrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHNlbGZpZXMgc3VibWl0dGVkIHRvIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VsZmllQ2hlY2tTZWxmaWU+fVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1xuICAgICAqL1xuICAgIHNlbGZpZXM6IEFycmF5PFNlbGZpZUNoZWNrU2VsZmllPjtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYW5kIGFuYWx5c2lzIGZyb20gYSB1c2VyXFwncyBzZWxmaWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrU2VsZmllXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IHNlbGZpZSB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNhcHR1cmV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgY2FwdHVyZTogU2VsZmllQ2FwdHVyZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYW5hbHlzaXM6IFNlbGZpZUFuYWx5c2lzO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnNlbGZpZV9jaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVDaGVja1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIHNlbGZpZS4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgc2VsZmllX2NoZWNrLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIHNlbGZpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJBQ1MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhpcyByZWNpcGllbnQgbmVlZHMgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQkFDUyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbCB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlckFkZHJlc3NEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IGRlY2lzaW9uIGZyb20gdGhlIHJpc2sgYXNzZXNzbWVudC4gIGBBUFBST1ZFYDogYXBwcm92ZSB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZXF1aXJpbmcgZnVydGhlciBhY3Rpb25zIGZyb20geW91ciBjdXN0b21lcnMuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgYXJlIHBsYWNpbmcgYSBzdGFuZGFyZCBob2xkIGZvciBhbGwgdGhlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gWW91IHNob3VsZCBhbHNvIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBkZWNpZGUgdG8gYWNjZWxlcmF0ZSB0aGUgZnVuZCBhdmFpbGFiaWxpdHkgZm9yIHlvdXIgY3VzdG9tZXJzLiAgYFJFVklFV2A6IHRoZSB0cmFuc2FjdGlvbiByZXF1aXJlcyBtYW51YWwgcmV2aWV3ICBgUkVKRUNUYDogcmVqZWN0IHRoZSB0cmFuc2FjdGlvbiAgYFRBS0VfT1RIRVJfUklTS19NRUFTVVJFU2A6IGZvciBleGFtcGxlLCBwbGFjaW5nIGEgbG9uZ2VyIGhvbGQgb24gZnVuZHMgdGhhbiB0aG9zZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgb3IgaW50cm9kdWNpbmcgY3VzdG9tZXIgZnJpY3Rpb25zIHN1Y2ggYXMgc3RlcC11cCB2ZXJpZmljYXRpb24vYXV0aGVudGljYXRpb24gIGBOT1RfRVZBTFVBVEVEYDogaWYgb25seSBsb2dnaW5nIHRoZSBTaWduYWwgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gIFBvc3NpYmxlIHZhbHVlczogIGBBUFBST1ZFYCwgYFJFVklFV2AsIGBSRUpFQ1RgLCBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYCwgYE5PVF9FVkFMVUFURURgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWF0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFjdHVhbCBudW1iZXIgb2YgZGF5cyAoaG9sZCB0aW1lKSBzaW5jZSB0aGUgQUNIIGRlYml0IHRyYW5zYWN0aW9uIHRoYXQgeW91IHdhaXQgYmVmb3JlIG1ha2luZyBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMuIFRoZSBob2xkaW5nIHRpbWUgY291bGQgYWZmZWN0IHRoZSBBQ0ggcmV0dXJuIHJhdGUuICBGb3IgZXhhbXBsZSwgdXNlIDAgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBvciB0aGUgc2FtZSBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbiwgb3IgMSBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdGhlIG5leHQgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19mdW5kc19vbl9ob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGVjaXNpb25PdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9vdXRjb21lPzogU2lnbmFsRGVjaXNpb25PdXRjb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGF5bWVudE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q/OiBTaWduYWxQYXltZW50TWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IChpbiBVU0QpIG1hZGUgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLiBJdCBjb3VsZCBiZSBhIHBhcnRpYWwgYW1vdW50IG9mIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24gKGV4YW1wbGU6IDEwMi4wNSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50X2luc3RhbnRseV9hdmFpbGFibGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBkZXZpY2UuIFdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9zaWduYWwvcHJvY2Vzc29yL2V2YWx1YXRlYCwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiBTaWduYWwgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuIFxcXCJNb3ppbGxhLzUuMFxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjb3JlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6ICBgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uYDogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXMgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgYGlzX3NhdmluZ3Nfb3JfbW9uZXlfbWFya2V0X2FjY291bnRgOiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnQgIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IFNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgd2l0aGluIHRoZSBwYXN0IDkwIGRheXMgd2hlbiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBoYWQgYSBuZWdhdGl2ZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZhaWxhYmxlIGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3VycmVudF9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGJhbGFuY2VfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMzAgZGF5cyAobWF4IDEwMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgOTAgZGF5cyAobWF4IDEwMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgU1NML1RMUyBjb25uZWN0aW9uIHNlc3Npb25zIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBiYW5rIGFjY291bnQgd2FzIG9wZW5lZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXSgvZG9jcy9saW5rL2lvcy8jbGluay1pb3Mtb25zdWNjZXNzLWxpbmtTdWNjZXNzLW1ldGFkYXRhLWFjY291bnRzLWlkKSBjYWxsYmFjayBtZXRhZGF0YS4gIFRoaXMgd2lsbCByZXR1cm4gYW4gW2BJTlZBTElEX0FDQ09VTlRfSURgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1pbnB1dC8jaW52YWxpZF9hY2NvdW50X2lkKSBlcnJvciBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIGF0IHRoZSBiYW5rIG9yIGlmIHRoZSBgYWNjb3VudF9pZGAgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBlbmQgdXNlciBpcyBwcmVzZW50IHdoaWxlIGluaXRpYXRpbmcgdGhlIEFDSCB0cmFuc2ZlciBhbmQgdGhlIGVuZHBvaW50IGlzIGJlaW5nIGNhbGxlZDsgYGZhbHNlYCBvdGhlcndpc2UgKGZvciBleGFtcGxlLCB3aGVuIHRoZSBBQ0ggdHJhbnNmZXIgaXMgc2NoZWR1bGVkIGFuZCB0aGUgZW5kIHVzZXIgaXMgbm90IHByZXNlbnQsIG9yIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgdGhlIEFDSCB0cmFuc2ZlciBidXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIE5hY2hhIGZpbGUgZm9yIEFDSCBwcm9jZXNzaW5nKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBJdGVtcy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHJlY3VycmluZyB0cmFuc2FjdGlvbjsgYGZhbHNlYCBvdGhlcndpc2UgXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOQUNIQS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSBgUkVBTF9USU1FX1BBWU1FTlRTYDogcmVhbC10aW1lIHBheW1lbnRzIHN1Y2ggYXMgUlRQIGFuZCBGZWROb3cgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHJpc2tfcHJvZmlsZV9rZXlgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBydWxlc2V0YCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlX2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgUnVsZXNldCB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFlvdSBjYW4gY29uZmlndXJlIGEgUnVsZXNldCB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBub3QgcHJvdmlkZWQsIG5vIFJ1bGVzZXQgd2lsbCBiZSB1c2VkLiBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBydWxlc2V0X2tleT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY29yZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29yZXM6IFNpZ25hbFNjb3JlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrUHJvZmlsZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlPzogUmlza1Byb2ZpbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSdWxlc2V0fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZXNldD86IFJ1bGVzZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBhZnRlciB0aGUgcmlzayBhc3Nlc3NtZW50LiBJdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgcGF5bWVudCBtZXRob2QuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSAgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgIGBTVEFOREFSRF9BQ0hgOiBzdGFuZGFyZCBBQ0ggYnkgTkFDSEEgIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyAgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyAgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciB0aGVyZSBhcmUgbXVsdGlwbGUgcGF5bWVudCBtZXRob2RzICBQb3NzaWJsZSB2YWx1ZXM6IGBTQU1FX0RBWV9BQ0hgLCBgTkVYVF9EQVlfQUNIYCwgYFNUQU5EQVJEX0FDSGAsIGBSRUFMX1RJTUVfUEFZTUVOVFNgLCBgREVCSVRfQ0FSRGAsIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsUGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIE5leHREYXlBY2ggPSAnTkVYVF9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIFJlYWxUaW1lUGF5bWVudHMgPSAnUkVBTF9USU1FX1BBWU1FTlRTJyxcbiAgICBEZWJpdENhcmQgPSAnREVCSVRfQ0FSRCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHByZWZpeCAoZS5nLiBcXFwiTXIuXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgcHJlZml4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZ2l2ZW4gbmFtZS4gSWYgdGhlIHVzZXIgaGFzIGEgb25lLXdvcmQgbmFtZSwgaXQgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZhbWlseSBuYW1lIC8gc3VybmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgc3VmZml4IChlLmcuIFxcXCJJSVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXR1cm5zIGZyb20geW91ciBwYXltZW50IHByb2Nlc3NvcnMsIGluIElTTyA4NjAxIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybmVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlIGBkZWZhdWx0X3BheW1lbnRfbWV0aG9kYCBmaWVsZCBkaXJlY3RseSBpbXBhY3RzIHRoZSB0aW1pbmcgcmVjb21tZW5kYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBBUEkgZm9yIHN1Ym1pdHRpbmcgdGhlIGRlYml0IGVudHJ5IHRvIHlvdXIgcHJvY2Vzc29yIG9yIE9ERkkuIElmIHVuc3BlY2lmaWVkLCBTaWduYWwgZGVmYXVsdHMgdG8gYFNUQU5EQVJEX0FDSGAuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIChhcyBkZWZpbmVkIGJ5IE5hY2hhKS4gVGhlIFNpZ25hbCBBUEkgYXNzdW1lcyB0aGUgc2V0dGxlbWVudCB3aWxsIG9jY3VyIG9uIHRoZSBzYW1lIGJ1c2luZXNzIGRheSBpZiB0aGUgYC9zaWduYWwvc2NoZWR1bGVgIHJlcXVlc3QgaXMgc3VibWl0dGVkIGJ5IDY6MDAgUE0gVVRDLiBOb3RlOiBUaGUgYWN0dWFsIGN1dG9mZiB0aW1lIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIG9yIE9ERkkuIE5BQ0hBIGhhcyBlc3RhYmxpc2hlZCB0aHJlZSBwcm9jZXNzaW5nIHdpbmRvd3MgZm9yIFNhbWUgRGF5IEFDSCAoVVRDKTogMjozMCBQTSwgNjo0NSBQTSwgYW5kIDg6NDUgUE0uICBgU1RBTkRBUkRfQUNIYDogU3RhbmRhcmQgQUNIIChhcyBkZWZpbmVkIGJ5IE5hY2hhKSwgdHlwaWNhbGx5IHNldHRsZWQgb25lIHRvIHRocmVlIGJ1c2luZXNzIGRheXMgYWZ0ZXIgc3VibWlzc2lvbi4gIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiBSZWFsLXRpbWUgcGF5bWVudHMgdmlhIFJlcXVlc3QgZm9yIFBheW1lbnQgdGhyb3VnaCBuZXR3b3JrcyBzdWNoIGFzIFJUUCAoVGhlIENsZWFyaW5nIEhvdXNlKSBhbmQgRmVkTm93LCB3aGVyZSB0aGUgY29uc3VtZXIgY2FuIGF1dGhvcml6ZSB0aGUgcGF5bWVudCBpbiByZXNwb25zZSB0byBhIFJGUCwgYW5kIHRoZSB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgaW1tZWRpYXRlbHkuICBgREVCSVRfQ0FSRGA6IFBheW1lbnRzIHByb2Nlc3NlZCBvdmVyIGRlYml0IGNhcmQgbmV0d29ya3MsIGxldmVyYWdpbmcgdGhlIGNhcmQtYmFzZWQgaW5mcmFzdHJ1Y3R1cmUgZm9yIHJlYWwtdGltZSBvciBuZWFyLXJlYWwtdGltZSBzZXR0bGVtZW50LiAgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IEluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgYXJlIGF2YWlsYWJsZSwgYW5kIHRoZSB0cmFuc2FjdGlvbiBjb3VsZCB1c2UgYW55IG9mIHRoZW0gYmFzZWQgb24gY3VzdG9tZXIgcG9saWN5IG9yIGF2YWlsYWJpbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNpZ25hbFNjaGVkdWxlRGVmYXVsdFBheW1lbnRNZXRob2Qge1xuICAgIFNhbWVEYXlBY2ggPSAnU0FNRV9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIFJlYWxUaW1lUGF5bWVudHMgPSAnUkVBTF9USU1FX1BBWU1FTlRTJyxcbiAgICBEZWJpdENhcmQgPSAnREVCSVRfQ0FSRCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogQ29udmV5cyBpbmZvcm1hdGlvbiBvbiBpZiBhIHJldHJ5IGlzIHJlY29tbWVuZGVkIG9uIGEgZ2l2ZW4gZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIGRhdGUgZm9yIHN1Ym1pdHRpbmcgdGhlIGRlYml0IGVudHJ5LCBmb3JtYXR0ZWQgaW4gSVNPIDg2MDEgKGUuZy4sIFxcXCIyMDI1LTAxLTE3XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvblxuICAgICAqL1xuICAgIGRhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY29tbWVuZGF0aW9uU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmVjb21tZW5kYXRpb24/OiBSZWNvbW1lbmRhdGlvblN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuayBvZiB0aGUgcmVjb21tZW5kYXRpb24gYmFzZWQgb24gdGhlIGxpa2VsaWhvb2Qgb2YgZGViaXQgc3VjY2Vzcywgd2l0aCAxIHJlcHJlc2VudGluZyB0aGUgbW9zdCBvcHRpbWFsIGRhdGUuIERhdGVzIHdpdGggYE5PVF9SRUNPTU1FTkRFRGAgb3IgYFVOS05PV05gIHdpbGwgaGF2ZSByYW5rIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmFuaz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvc2NoZWR1bGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXSgvZG9jcy9saW5rL2lvcy8jbGluay1pb3Mtb25zdWNjZXNzLWxpbmtTdWNjZXNzLW1ldGFkYXRhLWFjY291bnRzLWlkKSBjYWxsYmFjayBtZXRhZGF0YS4gIFRoaXMgd2lsbCByZXR1cm4gYW4gW2BJTlZBTElEX0FDQ09VTlRfSURgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1pbnB1dC8jaW52YWxpZF9hY2NvdW50X2lkKSBlcnJvciBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIGF0IHRoZSBiYW5rIG9yIGlmIHRoZSBgYWNjb3VudF9pZGAgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjaGVkdWxlRGVmYXVsdFBheW1lbnRNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBTaWduYWxTY2hlZHVsZURlZmF1bHRQYXltZW50TWV0aG9kO1xufVxuLyoqXG4gKiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvc2NoZWR1bGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjb21tZW5kZWQgb3B0aW1hbCBkYXRlIHRvIHN1Ym1pdCB0aGUgZGViaXQgZW50cnksIGZvcm1hdHRlZCBpbiBJU08gODYwMSBcXFwiWVlZWS1NTS1ERFxcXCIgKGUuZy4sIFxcXCIyMDI0LTAzLTMwXFxcIikuIFRoZSBgb3B0aW1hbF9kYXRlYCBpcyBkZXJpdmVkIGZyb20gdGhlIGRhdGUgd2l0aCByYW5rID0gMSBpbiB0aGUgZm9sbG93aW5nIHJlY29tbWVuZGF0aW9ucyBhcnJheS4gIE5PVEU6IFRoZSBgZGVmYXVsdF9wYXltZW50X21ldGhvZGAgZmllbGQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdpbGwgYWZmZWN0IHRoZSByZWNvbW1lbmRhdGlvbiwgc2luY2Ugd2VcXCdyZSBhY2NvdW50aW5nIGZvciBkZWJpdCBzZXR0bGVtZW50IHRpbWUuICBUaGUgZGViaXQgc2NoZWR1bGluZyBldmFsdWF0aW9uIHN0YXJ0cyBmcm9tIHRoZSBkYXkgdGhlIC9zaWduYWwvc2NoZWR1bGUgcmVxdWVzdCBpcyBzdWJtaXR0ZWQgKERheSAwKSBvciB0aGUgbmV4dCBiYW5raW5nIGRheSBpZiB0aGUgc3VibWlzc2lvbiBkYXkgaXMgbm90IGEgYmFua2luZyBkYXksIGFuZCBleHRlbmRzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBmaXZlIGJhbmtpbmcgZGF5cyAoRGF5IDEgdG8gRGF5IDUpLiBJZiBubyBkYXRlIHdpdGhpbiB0aGlzIHBlcmlvZCBpcyBjb25zaWRlcmVkIGxpa2VseSB0byByZXN1bHQgaW4gYSBzdWNjZXNzZnVsIGRlYml0IGF0dGVtcHQsIGBudWxsYCB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgYG9wdGltYWxfZGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9wdGltYWxfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGFycmF5IHByb3ZpZGVzIGEgZGF0ZS1ieS1kYXRlIGV2YWx1YXRpb24gb2YgZGViaXQgc3VibWlzc2lvbiByZWNvbW1lbmRhdGlvbnMgd2l0aGluIHRoZSBmaXZlIGJhbmtpbmcgZGF5IGV2YWx1YXRpb24gcGVyaW9kLiBFYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgcmVwcmVzZW50cyBhIHJldHJ5IHJlY29tbWVuZGF0aW9uIGZvciBhIHNwZWNpZmljIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFNjaGVkdWxlUmVjb21tZW5kYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjb21tZW5kYXRpb25zOiBBcnJheTxTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uPjtcbiAgICAvKipcbiAgICAgKiBJZiBiYW5rIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gdGhlIFNpZ25hbCBtb2RlbCwgdGhpcyBhcnJheSBjb250YWlucyB3YXJuaW5ncyBkZXNjcmliaW5nIHdoeSBiYW5rIGRhdGEgaXMgbWlzc2luZy4gSWYgeW91IHdhbnQgdG8gcmVjZWl2ZSBhbiBBUEkgZXJyb3IgaW5zdGVhZCBvZiBTaWduYWwgc2NvcmVzIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgYmFuayBkYXRhLCBmaWxlIGEgc3VwcG9ydCB0aWNrZXQgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2lnbmFsV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8U2lnbmFsV2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJpc2sgc2NvcmluZyBkZXRhaWxzIGJyb2tlbiBkb3duIGJ5IHJpc2sgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjb3Jlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjb3JlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0N1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2s/OiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzaztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXIgaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gKGkuZS4sIHRoZSBhY2NvdW50IGhvbGRlcikuIFdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9zaWduYWwvcHJvY2Vzc29yL2V2YWx1YXRlYCwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiBTaWduYWwgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFVzZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQZXJzb25OYW1lfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgbmFtZT86IFNpZ25hbFBlcnNvbk5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIENvbnZleXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIG1pc3Npbmcgb3Igc3RhbGUgYmFuayBkYXRhIHVzZWQgdG8gY29uc3RydWN0IHRoZSAvc2lnbmFsL2V2YWx1YXRlIHNjb3JlcyBhbmQgcmVzcG9uc2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSBTaWduYWwgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2FybmluZyB0eXBlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN3ZWVwIHJldHVybmVkIGZyb20gdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQuIENhbiBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyB0cmFuc2ZlcnMgdG8gaW5jbHVkZSBpbiBhIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFN3ZWVwRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGFsbCByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZTogUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeTogRG9jdW1lbnRSaXNrU3VtbWFyeTtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hldGhlciBhIGRhc2hib2FyZCB1c2VyLCBhbiBBUEktYmFzZWQgdXNlciwgb3IgUGxhaWQgbGFzdCB0b3VjaGVkIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBMaW5rID0gJ2xpbmsnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLiBGb3IgYSBtYXBwaW5nIG9mIHN1cHBvcnRlZCB0eXBlcyBhbmQgc3VidHlwZXMgdG8gUGxhaWQgcHJvZHVjdHMsIHNlZSB0aGUgW0FjY291bnQgdHlwZSAvIHByb2R1Y3Qgc3VwcG9ydCBtYXRyaXhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtLXByb2R1Y3Qtc3VwcG9ydC1tYXRyaXgpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY3JlZGl0IGNhcmQgdHlwZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGNyZWRpdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbG9hbiB0eXBlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgbG9hbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGludmVzdG1lbnQgYWNjb3VudC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgdHlwZSBpcyBjYWxsZWQgYGJyb2tlcmFnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgaW52ZXN0bWVudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE90aGVyIG9yIHVua25vd24gYWNjb3VudCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIG90aGVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgY3VycmVuY3kgY29kZXMgYXJlIHN1cHBvcnRlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdCB7XG4gICAgLyoqXG4gICAgICogUGxhaWQgc3VwcG9ydHMgYWxsIElTTyA0MjE3IGN1cnJlbmN5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCB2YWx1ZXMgZm9yIGludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLiBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIHJlcHJlc2VudGluZyBpbmZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBuZWdhdGl2ZSBhbW91bnRzLCBvdXRmbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgcG9zaXRpdmUgYW1vdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgICogQnV5aW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGJ1eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNlbGxpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgc2VsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY2FuY2VsbGF0aW9uIG9mIGEgcGVuZGluZyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FuY2VsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhc2g6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGZWVzIG9uIHRoZSBhY2NvdW50LCBlLmcuIGNvbW1pc3Npb24sIGJvb2trZWVwaW5nLCBvcHRpb25zLXJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBmZWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X29mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3VidHlwZSBvZiB0aGUgYWNjb3VudC4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudC4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Ygc3RhdGVtZW50c1xcJyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzU3RhdGVtZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzOiBBcnJheTxTdGF0ZW1lbnRzU3RhdGVtZW50Pjtcbn1cbi8qKlxuICogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RhdGVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8U3RhdGVtZW50c0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IHJlZnJlc2ggZXh0cmFjdGlvbiAgYFNVQ0NFU1NgOiBUaGUgc3RhdGVtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgYW5kIGNhbiBiZSBsaXN0ZWQgdmlhIGAvc3RhdGVtZW50cy9saXN0L2AgYW5kIGRvd25sb2FkZWQgdmlhIGAvc3RhdGVtZW50cy9kb3dubG9hZC9gLiAgYEZBSUxVUkVgOiBUaGUgc3RhdGVtZW50cyBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiByZWZyZXNoZWQgc3RhdGVtZW50cyBleHRyYWN0aW9uIGlzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYmUgY29tcGxldGVkLiBUcmlnZ2VyZWQgYnkgY2FsbGluZyBgL3N0YXRlbWVudHMvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTVEFURU1FTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMy0wOC0zMFxcXCIuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTW9udGggb2YgdGhlIHllYXIuIFBvc3NpYmxlIHZhbHVlczogMSB0aHJvdWdoIDEyIChKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBtb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIG9mIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgeWVhcjogbnVtYmVyO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogU2F0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLiBFYWNoIGFjY291bnQgY2FuIG9ubHkgY29udGFpbiBvbmUgbGlhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIGFuZCBOYXZpZW50IChgaW5zXzExNjI0OGApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbl9zY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBgYWNjb3VudF9udW1iZXIsYCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnLFxuICAgIFBlbmRpbmdJZHIgPSAncGVuZGluZyBpZHInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEluY29tZVNlbnNpdGl2ZVJlcGF5bWVudCA9ICdpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudCcsXG4gICAgSW50ZXJlc3RPbmx5ID0gJ2ludGVyZXN0LW9ubHknLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXlBc1lvdUVhcm4gPSAncGF5IGFzIHlvdSBlYXJuJyxcbiAgICBSZXZpc2VkUGF5QXNZb3VFYXJuID0gJ3JldmlzZWQgcGF5IGFzIHlvdSBlYXJuJyxcbiAgICBTdGFuZGFyZCA9ICdzdGFuZGFyZCcsXG4gICAgU2F2aW5nT25BVmFsdWFibGVFZHVjYXRpb24gPSAnc2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBzdGF0dXMgZm9yIGEgc3dlZXAgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTd2VlcEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBzd2VlcCBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3dlZXBGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN3ZWVwRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN3ZWVwIHRyYW5zZmVyICBgXFxcInBlbmRpbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjdXJyZW50bHkgcGVuZGluZyBgXFxcInBvc3RlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBiZWVuIHBvc3RlZCBgXFxcInNldHRsZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgc2V0dGxlZCBgXFxcInJldHVybmVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGJlZW4gcmV0dXJuZWQgYFxcXCJmYWlsZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgZmFpbGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTd2VlcFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHRyaWdnZXIgb2YgdGhlIHN3ZWVwICBgXFxcIm1hbnVhbFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIGN1c3RvbWVyIGBcXFwiaW5jb21pbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGluY29taW5nIGZ1bmRzIGZsb3cgKGUuZy4gSW5jb21pbmcgV2lyZSkgYFxcXCJiYWxhbmNlX3RocmVzaG9sZFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgYmFsYW5jZSB0aHJlc2hvbGQgc2V0dGluZyBgXFxcImF1dG9tYXRpY19hZ2dyZWdhdGVcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IHRoZSBQbGFpZCBhdXRvbWF0aWMgYWdncmVnYXRpb24gcHJvY2Vzcy4gVGhlc2UgZnVuZHMgZGlkIG5vdCBwYXNzIHRocm91Z2ggdGhlIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBUcmlnZ2VyIHtcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgICBJbmNvbWluZyA9ICdpbmNvbWluZycsXG4gICAgQmFsYW5jZVRocmVzaG9sZCA9ICdiYWxhbmNlX3RocmVzaG9sZCcsXG4gICAgQXV0b21hdGljQWdncmVnYXRlID0gJ2F1dG9tYXRpY19hZ2dyZWdhdGUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IGFzIGl0IHdvdWxkIGluIFByb2R1Y3Rpb24uIEl0IGNhbiBhbHNvIGJlIG1hbnVhbGx5IHRyaWdnZXJlZCBpbiBTYW5kYm94IGJ5IGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluaXRpYWwgcHVsbCBpbmZvcm1hdGlvbiAobW9zdCByZWNlbnQgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGluaXRpYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBoaXN0b3JpY2FsIHB1bGwgaW5mb3JtYXRpb24gKG1heGltdW0gdHJhbnNhY3Rpb24gaGlzdG9yeSByZXF1ZXN0ZWQsIHVwIHRvIDIgeWVhcnMpIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmllbGQgY29udGFpbmluZyB0aGUgZGF0YSB1c2VkIGluIGRldGVybWluaW5nIHRoZSBvdXRjb21lIG9mIGEgc3ludGhldGljIGZyYXVkIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN5bnRoZXRpY0ZyYXVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhldGljRnJhdWQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFN5bnRoZXRpY0ZyYXVkXG4gICAgICovXG4gICAgcmlza19sZXZlbDogUmlza0xldmVsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IGFuIG9mZmljaWFsIGRvY3VtZW50IHVzZWQgdG8gcmVwb3J0IHRoZSB1c2VyXFwncyBpbmNvbWUgdG8gdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4Zm9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheGZvcm0ge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGF4IGRvY3VtZW50LiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgdzJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1cyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgdzI/OiBXMjtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklEXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJRCB7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMYXN0IDQgZGlnaXRzIG9mIHVuaXF1ZSBudW1iZXIgb2YgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGFzdF80X2RpZ2l0cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LkluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJUeXBlOiBUYXhwYXllcklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRheHBheWVyIGlkZW50aWZpZXIgYXMgYXNzaWduZWQgYnkgdGhlIElSUyB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyXG4gICAgICovXG4gICAgVGF4cGF5ZXJJZGVudGlmaWVyVmFsdWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IGNsYXNzaWZpZXMgaWRlbnRpZmljYXRpb24gbnVtYmVycyB1c2VkIGJ5IHRoZSBJbnRlcm5hbCBSZXZlbnVlIFNlcnZpY2UgKElSUykgaW4gdGhlIGFkbWluaXN0cmF0aW9uIG9mIHRheCBsYXdzLiBBIFNvY2lhbCBTZWN1cml0eSBudW1iZXIgKFNTTikgaXMgaXNzdWVkIGJ5IHRoZSBTU0E7IGFsbCBvdGhlciB0YXhwYXllciBpZGVudGlmaWNhdGlvbiBudW1iZXJzIGFyZSBpc3N1ZWQgYnkgdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRheHBheWVySWRlbnRpZmllclR5cGUge1xuICAgIEluZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyID0gJ0luZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyJyxcbiAgICBTb2NpYWxTZWN1cml0eU51bWJlciA9ICdTb2NpYWxTZWN1cml0eU51bWJlcidcbn1cblxuLyoqXG4gKiBUaGUgY29sbGVjdGlvbiBvZiBUQVhQQVlFUl9JREVOVElGSUNBVElPTiBlbGVtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyc1xuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVI6IFRheHBheWVySWRlbnRpZmllcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGEgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgdGltZSBwZXJpb2Qgb2YgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDMwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCA2MCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgOTAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCBhYm91dCB0aGUgdG90YWwgbW9udGhseSBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIGZvciB0aGUgMzAgZGF5cyBwcmlvciB0byBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsTW9udGhseUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIG9mIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIHRpbWUgcGVyaW9kIG9mIHRoZSByZXBvcnQuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCAzMCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50MzBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgNjAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDkwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgIE5vdGU6IFRoaXMgaXMgYSBsZWdhY3kgZmllbGQgdGhhdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZC4gVXNlIGBtZXJjaGFudF9uYW1lYCBpbnN0ZWFkIGZvciB0aGUgbWVyY2hhbnQgbmFtZS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBpZiB0aGUgY2xpZW50IGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBwcm92aWRlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLiBBIHN1Yi1hY2NvdW50IG1vc3QgY29tbW9ubHkgZXhpc3RzIGluIGNhc2VzIHdoZXJlIGEgc2luZ2xlIGFjY291bnQgaXMgbGlua2VkIHRvIG11bHRpcGxlIGNhcmRzLCBlYWNoIHdpdGggaXRzIG93biBjYXJkIG51bWJlciBhbmQgY2FyZCBob2xkZXIgbmFtZTsgZWFjaCBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZCBhIHN1Yi1hY2NvdW50LiBJZiB0aGUgYWNjb3VudCBkb2VzIGhhdmUgc3ViLWFjY291bnRzLCB0aGlzIGZpZWxkIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWUgY29tYmluYXRpb24gb2YgdGhlIHN1Yi1hY2NvdW50IG93bmVyXFwncyBuYW1lIGFuZC9vciB0aGUgc3ViLWFjY291bnQgbWFzay4gVGhlIGZvcm1hdCBvZiB0aGlzIGZpZWxkIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kIHdpbGwgdmFyeSBiYXNlZCBvbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuIEluIHRoZSBjYXNlIG9mIGEgbWVyY2hhbnQgd2l0aCBtdWx0aXBsZSByZXRhaWwgbG9jYXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBicm9hZGVyIG1lcmNoYW50LCBub3QgYSBzcGVjaWZpYyBsb2NhdGlvbiBvciBzdG9yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LiBJbiB0aGUgY2FzZSBvZiBhIG1lcmNoYW50IHdpdGggbXVsdGlwbGUgcmV0YWlsIGxvY2F0aW9ucywgdGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYnJvYWRlciBtZXJjaGFudCwgbm90IGEgc3BlY2lmaWMgbG9jYXRpb24gb3Igc3RvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICAgTm90ZTogVGhpcyBpcyBhIGxlZ2FjeSBmaWVsZCB0aGF0IGlzIG5vdCBhY3RpdmVseSBtYWludGFpbmVkLiBVc2UgYG1lcmNoYW50X25hbWVgIGluc3RlYWQgZm9yIHRoZSBtZXJjaGFudCBuYW1lLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGluY2x1ZGVkIGlmIHRoZSBjbGllbnQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuIEEgc3ViLWFjY291bnQgbW9zdCBjb21tb25seSBleGlzdHMgaW4gY2FzZXMgd2hlcmUgYSBzaW5nbGUgYWNjb3VudCBpcyBsaW5rZWQgdG8gbXVsdGlwbGUgY2FyZHMsIGVhY2ggd2l0aCBpdHMgb3duIGNhcmQgbnVtYmVyIGFuZCBjYXJkIGhvbGRlciBuYW1lOyBlYWNoIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkIGEgc3ViLWFjY291bnQuIElmIHRoZSBhY2NvdW50IGRvZXMgaGF2ZSBzdWItYWNjb3VudHMsIHRoaXMgZmllbGQgd2lsbCB0eXBpY2FsbHkgYmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgc3ViLWFjY291bnQgb3duZXJcXCdzIG5hbWUgYW5kL29yIHRoZSBzdWItYWNjb3VudCBtYXNrLiBUaGUgZm9ybWF0IG9mIHRoaXMgZmllbGQgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgd2lsbCB2YXJ5IGJhc2VkIG9uIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBBbiBpZGVudGlmaWVyIGNsYXNzaWZ5aW5nIHRoZSB0cmFuc2FjdGlvbiB0eXBlLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhLCB0aGlzIGZpZWxkIGlzIHNldCB0byBgbnVsbGAuICBgYWRqdXN0bWVudDpgIEJhbmsgYWRqdXN0bWVudCAgYGF0bTpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsIHZpYSBhbiBhdXRvbWF0ZWQgdGVsbGVyIG1hY2hpbmUgIGBiYW5rIGNoYXJnZTpgIENoYXJnZSBvciBmZWUgbGV2aWVkIGJ5IHRoZSBpbnN0aXR1dGlvbiAgYGJpbGwgcGF5bWVudGA6IFBheW1lbnQgb2YgYSBiaWxsICBgY2FzaDpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsICBgY2FzaGJhY2s6YCBDYXNoIHdpdGhkcmF3YWwgd2hpbGUgbWFraW5nIGEgZGViaXQgY2FyZCBwdXJjaGFzZSAgYGNoZXF1ZTpgIERvY3VtZW50IG9yZGVyaW5nIHRoZSBwYXltZW50IG9mIG1vbmV5IHRvIGFub3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiAgYGRpcmVjdCBkZWJpdDpgIEF1dG9tYXRpYyB3aXRoZHJhd2FsIG9mIGZ1bmRzIGluaXRpYXRlZCBieSBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYGludGVyZXN0OmAgSW50ZXJlc3QgZWFybmVkIG9yIGluY3VycmVkICBgcHVyY2hhc2U6YCBQdXJjaGFzZSBtYWRlIHdpdGggYSBkZWJpdCBvciBjcmVkaXQgY2FyZCAgYHN0YW5kaW5nIG9yZGVyOmAgUGF5bWVudCBpbnN0cnVjdGVkIGJ5IHRoZSBhY2NvdW50IGhvbGRlciB0byBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYHRyYW5zZmVyOmAgVHJhbnNmZXIgb2YgbW9uZXkgYmV0d2VlbiBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25Db2RlIHtcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEF0bSA9ICdhdG0nLFxuICAgIEJhbmtDaGFyZ2UgPSAnYmFuayBjaGFyZ2UnLFxuICAgIEJpbGxQYXltZW50ID0gJ2JpbGwgcGF5bWVudCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBDYXNoYmFjayA9ICdjYXNoYmFjaycsXG4gICAgQ2hlcXVlID0gJ2NoZXF1ZScsXG4gICAgRGlyZWN0RGViaXQgPSAnZGlyZWN0IGRlYml0JyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgUHVyY2hhc2UgPSAncHVyY2hhc2UnLFxuICAgIFN0YW5kaW5nT3JkZXIgPSAnc3RhbmRpbmcgb3JkZXInLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgdHlwZTogQ291bnRlcnBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNvdW50ZXJwYXJ0eSBpcyBpbnZvbHZlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBgVkVSWV9ISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY291bnRlcnBhcnR5IHdhcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBidXQgc29tZSBkZXRhaWxzIG1heSBkaWZmZXIgZnJvbSBvdXIgcmVjb3Jkcy4gYExPV2A6IFdlIGRpZG7igJl0IGZpbmQgYSBtYXRjaGluZyBjb3VudGVycGFydHkgaW4gb3VyIHJlY29yZHMsIHNvIHdlIGFyZSByZXR1cm5pbmcgYSBjbGVhbnNlZCBuYW1lIHBhcnNlZCBvdXQgb2YgdGhlIHJlcXVlc3QgZGVzY3JpcHRpb24uIGBVTktOT1dOYDogV2UgZG9u4oCZdCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2hlZCBkaXJlY3QgZGVwb3NpdCB0cmFuc2FjdGlvbiB1c2VkIHRvIHZlcmlmeSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIHRvIHBvcHVsYXRlIGFzIHRlc3QgdHJhbnNhY3Rpb24gZGF0YS4gSWYgbm90IHNwZWNpZmllZCwgcmFuZG9tIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBUcmFuc2FjdGlvbnMgaW4gU2FuZGJveCB3aWxsIG1vdmUgZnJvbSBwZW5kaW5nIHRvIHBvc3RlZCBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGRhdGUgaGFzIGJlZW4gcmVhY2hlZC4gSWYgYSBgZGF0ZV90cmFuc2FjdGVkYCBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBhIHRyYW5zYWN0aW9uIGRhdGUgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgW2BhdXRob3JpemVkX2RhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9ucy1nZXQtcmVzcG9uc2UtdHJhbnNhY3Rpb25zLWF1dGhvcml6ZWQtZGF0ZSkgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFBvc3RlZCBkYXRlcyBpbiB0aGUgcGFzdCBvciBwcmVzZW50IHdpbGwgcmVzdWx0IGluIHBvc3RlZCB0cmFuc2FjdGlvbnM7IHBvc3RlZCBkYXRlcyBpbiB0aGUgZnV0dXJlIHdpbGwgcmVzdWx0IGluIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIENhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogQSBncm91cGluZyBvZiByZWxhdGVkIHRyYW5zYWN0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIHN0cmVhbSBiZWxvbmdzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBzdHJlYW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZmlyc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGRhdGUgb2YgdGhlIG5leHQgcGF5bWVudC4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBuZXh0IHBheW1lbnQgZGF0ZSBjYW4gYmUgcHJlZGljdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgcHJlZGljdGVkX25leHRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeTogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbW9kaWZpZWQgYnkgcmVxdWVzdCB0byBhIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zYCBlbmRwb2ludC4gSXQgd2lsbCBiZSBgZmFsc2VgIGZvciBhbGwgb3RoZXIgc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc191c2VyX21vZGlmaWVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB1c2VyIG1vZGlmaWNhdGlvbi4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIGBpc191c2VyX21vZGlmaWVkYCBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X3VzZXJfbW9kaWZpZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIGRhdGEgcGVydGFpbmluZyB0byBhbiBhbW91bnQgb24gdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbUFtb3VudCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIGFuIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYE1BVFVSRWA6IEEgYE1BVFVSRWAgcmVjdXJyaW5nIHN0cmVhbSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHRyYW5zYWN0aW9ucyBhbmQgaGFwcGVuIG9uIGEgcmVndWxhciBjYWRlbmNlIChGb3IgQW5udWFsIHJlY3VycmluZyBzdHJlYW0sIHdlIHdpbGwgbWFyayBpdCBgTUFUVVJFYCBhZnRlciAyIGluc3RhbmNlcykuICBgRUFSTFlfREVURUNUSU9OYDogV2hlbiBhIHJlY3VycmluZyB0cmFuc2FjdGlvbiBmaXJzdCBhcHBlYXJzIGluIHRoZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGFuZCBiZWZvcmUgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IG9mIGEgbWF0dXJlIHN0cmVhbSwgdGhlIHN0YXR1cyB3aWxsIGJlIGBFQVJMWV9ERVRFQ1RJT05gLiAgYFRPTUJTVE9ORURgOiBBIHN0cmVhbSB0aGF0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBgRUFSTFlfREVURUNUSU9OYCBzdGF0dXMgd2lsbCBtb3ZlIHRvIHRoZSBgVE9NQlNUT05FRGAgc3RhdHVzIHdoZW4gbm8gZnVydGhlciB0cmFuc2FjdGlvbnMgd2VyZSBmb3VuZCBhdCB0aGUgbmV4dCBleHBlY3RlZCBkYXRlLiAgYFVOS05PV05gOiBBIHN0cmVhbSBpcyBhc3NpZ25lZCBhbiBgVU5LTk9XTmAgc3RhdHVzIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgc3RhdHVzZXMgYXJlIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBNYXR1cmUgPSAnTUFUVVJFJyxcbiAgICBFYXJseURldGVjdGlvbiA9ICdFQVJMWV9ERVRFQ1RJT04nLFxuICAgIFRvbWJzdG9uZWQgPSAnVE9NQlNUT05FRCdcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25zIGNhdGVnb3J5IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcnVsZSBjcmVhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgSXRlbSB0aGUgcnVsZSB3YXMgY3JlYXRlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSBydWxlIHdhcyBjcmVhdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IHVuaXF1ZSBpZGVudGlmaWVyLiAgSW4gdGhlIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdGF4b25vbXksIHRoaXMgZmllbGQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzPzogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbnMgKGBkZXBvc2l0b3J5YCBvciBgY3JlZGl0YCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiByYXcgdHJhbnNhY3Rpb25zIHRvIGJlIGVuaGFuY2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGVuaGFuY2VkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5oYW5jZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChlaXRoZXIgYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb24gb2JqZWN0cyB0byBiZSBlbnJpY2hlZCBieSBQbGFpZC4gTWF4aW11bSBvZiAxMDAgdHJhbnNhY3Rpb25zIHBlciByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGBsZWdhY3lfY2F0ZWdvcnlgIGFuZCBgbGVnYWN5X2NhdGVnb3J5X2lkYCBpbiB0aGUgcmVzcG9uc2UgKGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCkuICBDYXRlZ29yaWVzIGFyZSBiYXNlZCBvbiBQbGFpZFxcJ3MgbGVnYWN5IHRheG9ub215LiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9sZWdhY3lfY2F0ZWdvcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbnJpY2hlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5yaWNoZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIG9ubHkgYXBwbGllcyB0byBjYWxscyBmb3IgSXRlbXMgd2hlcmUgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIChpLmUuIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuIElmIGEgdmFsdWUgdW5kZXIgMzAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAzMCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVxdWVzdC4gIElmIHRoZSBJdGVtIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QsIHRoaXMgZmllbGQgd2lsbCBoYXZlIG5vIGVmZmVjdC4gVGhlIG1heGltdW0gYW1vdW50IG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBvbiBhbiBJdGVtIGNhbm5vdCBiZSB1cGRhdGVkIGlmIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtLiBUbyByZXF1ZXN0IG9sZGVyIHRyYW5zYWN0aW9uIGhpc3Rvcnkgb24gYW4gSXRlbSB3aGVyZSBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCwgeW91IG11c3QgZGVsZXRlIHRoZSBJdGVtIHZpYSBgL2l0ZW0vcmVtb3ZlYCBhbmQgc2VuZCB0aGUgdXNlciB0aHJvdWdoIExpbmsgdG8gY3JlYXRlIGEgbmV3IEl0ZW0uICAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFN0cmVhbXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIE90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zPzogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFJldHJpZXZlcyBhbGwgYWN0aXZlIGFjY291bnRzIG9uIGl0ZW0gaWYgbm8gYGFjY291bnRfaWRgcyBhcmUgcHJvdmlkZWQuICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQge1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBmaXJzdCBzdHJlYW0uIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmV0YWluIHRoZSBzdHJlYW1faWQgb2YgdGhlIGZpcnN0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRyYW5zYWN0aW9ucyBydWxlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBwcm92aWRlIHRyYW5zYWN0aW9uX2lkLiBGb3IgTkFNRSBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBOYW1lID0gJ05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBFWEFDVF9NQVRDSCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgZGV0YWlsZWQgY2F0ZWdvcnkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGFuZCBhY2N1cmF0ZSBjYXRlZ29yaXphdGlvbi4gIFNlZSB0aGUgW2B0YXhvbm9teSBjc3YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfZGV0YWlsczogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlOiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbiBydWxlc1xuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGVzOiBBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJ1bGVcXCdzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBUaGUgY3Vyc29yIGFsc28gYWNjZXB0cyB0aGUgc3BlY2lhbCB2YWx1ZSBvZiBgXFxcIm5vd1xcXCJgLCB3aGljaCBjYW4gYmUgdXNlZCB0byBmYXN0LWZvcndhcmQgdGhlIGN1cnNvciBhcyBwYXJ0IG9mIG1pZ3JhdGluZyBhbiBleGlzdGluZyBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBzeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gTm90ZSB0aGF0IHVzaW5nIHRoZSBgXFxcIm5vd1xcXCJgIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSB1c2UgY2FzZSBvdGhlciB0aGFuIG1pZ3JhdGluZyBleGlzdGluZyBJdGVtcyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAuICBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSByYXcgdW5wYXJzZWQgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24gZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB3aGVyZSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKGkuZS4sIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgb3B0aW9uYWxfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJlcXVlc3QuICBJZiB0aGUgSXRlbSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3Qgb24gYW4gSXRlbSBjYW5ub3QgYmUgdXBkYXRlZCBpZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbS4gVG8gcmVxdWVzdCBvbGRlciB0cmFuc2FjdGlvbiBoaXN0b3J5IG9uIGFuIEl0ZW0gd2hlcmUgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIHlvdSBtdXN0IGRlbGV0ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAgYW5kIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rIHRvIGNyZWF0ZSBhIG5ldyBJdGVtLiAgIEN1c3RvbWVycyB1c2luZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHNob3VsZCByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIHJldHVybmVkIHVwZGF0ZXMgYW5kIGN1cnNvciB3aWxsIG9ubHkgcmVmbGVjdCB0aGUgc3BlY2lmaWVkIGFjY291bnRcXCdzIHRyYW5zYWN0aW9ucy4gT21pdHRpbmcgYGFjY291bnRfaWRgIHJldHVybnMgdXBkYXRlcyBmb3IgYWxsIGFjY291bnRzIHVuZGVyIHRoZSBJdGVtLiBOb3RlIHRoYXQgc3BlY2lmeWluZyBhbiBgYWNjb3VudF9pZGAgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHNlcGFyYXRlIGluY3JlbWVudGFsIHVwZGF0ZSBzdHJlYW3igJRhbmQgdGhlcmVmb3JlIGEgc2VwYXJhdGUgY3Vyc29y4oCUZm9yIHRoYXQgYWNjb3VudC4gSWYgbXVsdGlwbGUgYWNjb3VudHMgYXJlIHF1ZXJpZWQgdGhpcyB3YXksIHlvdSB3aWxsIG1haW50YWluIG11bHRpcGxlIGN1cnNvcnMsIG9uZSBwZXIgYGFjY291bnRfaWRgLiAgIElmIHlvdSBkZWNpZGUgdG8gYmVnaW4gZmlsdGVyaW5nIGJ5IGBhY2NvdW50X2lkYCBhZnRlciB1c2luZyBubyBgYWNjb3VudF9pZGAsIHN0YXJ0IGZyZXNoIHdpdGggYSBudWxsIGN1cnNvciBhbmQgbWFpbnRhaW4gc2VwYXJhdGUgYChhY2NvdW50X2lkLCBjdXJzb3IpYCBwYWlycyBnb2luZyBmb3J3YXJkLiBEbyBub3QgcmV1c2UgYW55IHByZXZpb3VzbHkgc2F2ZWQgY3Vyc29ycywgYXMgdGhpcyBjYW4gY2F1c2UgcGFnaW5hdGlvbiBlcnJvcnMgb3IgaW5jb21wbGV0ZSBkYXRhLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZV9zdGF0dXM6IFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50cyBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHJlc3BvbnNlLiBPbmx5IGFjY291bnRzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIHNob3duLiBGb3IgZXhhbXBsZSwgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBJZiBgYWNjb3VudF9pZGAgaXMgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QsIHRoZSByZXR1cm5lZCBjdXJzb3Igd2lsbCByZWZsZWN0IHVwZGF0ZXMgZm9yIHRoYXQgc3BlY2lmaWMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1cGRhdGUgc3RhdHVzIGZvciB0cmFuc2FjdGlvbiBwdWxscyBvZiBhbiBJdGVtLiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRyYW5zYWN0aW9ucyB3ZWJob29rcywgYW5kIG1heSBiZSBoZWxwZnVsIGZvciB3ZWJob29rIHRyb3VibGVzaG9vdGluZyBvciB3aGVuIHJlY292ZXJpbmcgZnJvbSBtaXNzZWQgd2ViaG9va3MuICBgVFJBTlNBQ1RJT05TX1VQREFURV9TVEFUVVNfVU5LTk9XTmA6IFVuYWJsZSB0byBmZXRjaCB0cmFuc2FjdGlvbnMgdXBkYXRlIHN0YXR1cyBmb3IgSXRlbS4gYE5PVF9SRUFEWWA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgdHJhbnNhY3Rpb24gcHVsbC4gYElOSVRJQUxfVVBEQVRFX0NPTVBMRVRFYDogSW5pdGlhbCBwdWxsIGZvciB0aGUgSXRlbSBpcyBjb21wbGV0ZSwgaGlzdG9yaWNhbCBwdWxsIGlzIHBlbmRpbmcuIGBISVNUT1JJQ0FMX1VQREFURV9DT01QTEVURWA6IEJvdGggaW5pdGlhbCBhbmQgaGlzdG9yaWNhbCBwdWxsIGZvciBJdGVtIGFyZSBjb21wbGV0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cyB7XG4gICAgVHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzVW5rbm93biA9ICdUUkFOU0FDVElPTlNfVVBEQVRFX1NUQVRVU19VTktOT1dOJyxcbiAgICBOb3RSZWFkeSA9ICdOT1RfUkVBRFknLFxuICAgIEluaXRpYWxVcGRhdGVDb21wbGV0ZSA9ICdJTklUSUFMX1VQREFURV9DT01QTEVURScsXG4gICAgSGlzdG9yaWNhbFVwZGF0ZUNvbXBsZXRlID0gJ0hJU1RPUklDQUxfVVBEQVRFX0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGNsaWVudC1wcm92aWRlZCB1c2VyX2lkIHRvIHJldHJpZXZlIGluc2lnaHRzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJEYXRhT3ZlcnZpZXd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9kYXRhX292ZXJ2aWV3OiBVc2VyRGF0YU92ZXJ2aWV3O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHlfaW5zaWdodHM/OiBDb3VudGVycGFydHlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F0ZWdvcnlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pbnNpZ2h0cz86IENhdGVnb3J5SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNhY3Rpb25zPzogUmVjdXJyaW5nVHJhbnNhY3Rpb25zO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgd2lyZV9kZXRhaWxzPzogVHJhbnNmZXJXaXJlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MSwgUjUyLCBSNTMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiBzZXR0bGVtZW50IHdpbGwgb2NjdXIgYmV0d2VlbiBQbGFpZCBhbmQgdGhlIHJlY2VpdmluZyBiYW5rIChSREZJKS4gRm9yIEFDSCBkZWJpdHMsIHRoaXMgaXMgdGhlIGRhdGUgZnVuZHMgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgYmFuayBhY2NvdW50IGJlaW5nIGRlYml0ZWQuIEZvciBBQ0ggY3JlZGl0cywgdGhpcyBpcyB0aGUgZGF0ZSBmdW5kcyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgYmFuayBhY2NvdW50IGJlaW5nIGNyZWRpdGVkLiBPbmx5IHNldCBmb3IgQUNIIHRyYW5zZmVyczsgYG51bGxgIGZvciBub24tQUNIIHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBGb3IgYHJ0cGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBUcmFuc2FjdGlvbiBJZGVudGlmaWNhdGlvbiBudW1iZXIuIEZvciBgd2lyZWAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBJTUFEIChJbnB1dCBNZXNzYWdlIEFjY291bnRhYmlsaXR5IERhdGEpIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgQUNIIG5ldHdvcmtzIHVzZWQgZm9yIHRoZSBmdW5kcyBmbG93LiAgRm9yIHJlcXVlc3RzIHN1Ym1pdHRlZCBhcyBlaXRoZXIgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdGhlIGN1dG9mZiBmb3Igc2FtZS1kYXkgaXMgMzozMCBQTSBFYXN0ZXJuIFRpbWUgYW5kIHRoZSBjdXRvZmYgZm9yIG5leHQtZGF5IHRyYW5zZmVycyBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc3VibWl0IGEgcmVxdWVzdCBhdCBsZWFzdCAxNSBtaW51dGVzIGJlZm9yZSB0aGUgY3V0b2ZmIHRpbWUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBjdXRvZmYuIEFueSByZXF1ZXN0IHRoYXQgaXMgaW5kaWNhdGVkIGFzIGBzYW1lLWRheS1hY2hgIGFuZCB0aGF0IG1pc3NlcyB0aGUgc2FtZS1kYXkgY3V0b2ZmLCBidXQgaXMgc3VibWl0dGVkIGluIHRpbWUgZm9yIHRoZSBuZXh0LWRheSBjdXRvZmYsIHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBQ0hOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCdcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBmb3IgYSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSByZXByZXNlbnRpbmcgd2hlbiB0aGUgYXV0aG9yaXphdGlvbiB3YXMgY3JlYXRlZCwgaW4gdGhlIGZvcm1hdCBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheW1lbnRfcmlzazogVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBwcm9wb3NlZF90cmFuc2ZlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2Zlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXF1aXJlZCBpZiBub3QgdXNpbmcgYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX2RldGFpbHM/OiBUcmFuc2ZlcldpcmVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBhdXRob3JpemF0aW9uLCB3aGljaCBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIGF1dGhvcml6YXRpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0aG9yaXphdGlvbiBpcyBjcmVhdGVkLiAgSWRlbXBvdGVuY3kgZG9lcyBub3QgYXBwbHkgdG8gYXV0aG9yaXphdGlvbnMgd2hvc2UgZGVjaXNpb25zIGFyZSBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLiBUaGVyZWZvcmUgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYGlkZW1wb3RlbmN5X2tleWAuICBUaGlzIGlkZW1wb3RlbmN5IGtleSBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLCBhZnRlciB3aGljaCB0aGUgc2FtZSBrZXkgY2FuIGJlIHJldXNlZC4gRmFpbHVyZSB0byBwcm92aWRlIHRoaXMga2V5IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgaXMgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgUGxhaWQgd2lsbCBub3Qgb2ZmZXIgYSBgZ3VhcmFudGVlX2RlY2lzaW9uYCBmb3IgdGhpcyByZXF1ZXN0IChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2l0aF9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYnkgUGxhaWRcXCdzIFtiZWFjb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvZ3VhcmFudGVlLyN1c2luZy1hLWJlYWNvbikgd2hlbiBpdCBpcyBydW4gb24geW91ciB3ZWJwYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fc2Vzc2lvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgbmVlZGVkIGlmIGNyZWF0aW5nIHRyYW5zZmVycyBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZT86IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgYXV0aG9yaXphdGlvbmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIFJ1bGVzZXQgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgYXBwcm92ZWRgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBkZWNsaW5lZGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCDigJMgQW4gYWN0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBQbGFpZCBjYW4gYXNzZXNzIHRoZSB0cmFuc2ZlciByaXNrIGFuZCBtYWtlIGEgZGVjaXNpb24uIFRoZSBtb3N0IGNvbW1vbiBzY2VuYXJpbyBpcyB0byB1cGRhdGUgYXV0aGVudGljYXRpb24gZm9yIGFuIEl0ZW0uIFRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCBhY3Rpb24sIGluaXRpYWxpemUgTGluayBieSBzZXR0aW5nIGB0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYCBpbiB0aGUgcmVxdWVzdCBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gQWZ0ZXIgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIERlY2xpbmVkID0gJ2RlY2xpbmVkJyxcbiAgICBVc2VyQWN0aW9uUmVxdWlyZWQgPSAndXNlcl9hY3Rpb25fcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHJlZ2FyZGluZyBhIHByb3Bvc2VkIHRyYW5zZmVyLiBJdCBpcyBhbHdheXMgc2V0IGZvciBgZGVjbGluZWRgIGRlY2lzaW9ucywgYW5kIG1heSBvciBtYXkgbm90IGJlIG51bGwgZm9yIGBhcHByb3ZlZGAgZGVjaXNpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zZmVyIGFwcHJvdmFsIG9yIHRyYW5zZmVyIGRlY2xpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbGUgZm9yIGFwcHJvdmluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgSWYgdGhlIGByYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgcGFzc2VkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLiAgQW55IG5vbi1gbnVsbGAgdmFsdWUgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4gYW5kIHRoYXQgeW91IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgYXNzZXNzbWVudCBvbiB0aGUgdHJhbnNmZXIuIFRoZSBjb2RlIHdpbGwgaW5kaWNhdGUgd2h5IHRoZSBjaGVjayBjb3VsZCBub3QgYmUgcnVuLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgYXJlOiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIOKAkyBJdGVtIGNyZWF0ZWQgdmlhIGEgbWFudWFsIGVudHJ5IGZsb3cgKGkuZS4gU2FtZSBEYXkgTWljcm8tZGVwb3NpdCwgSW5zdGFudCBNaWNyby1kZXBvc2l0LCBEYXRhYmFzZSBJbnNpZ2h0cywgb3IgRGF0YWJhc2UgTWF0Y2gpLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIEl0ZW0gc3RhbGVuZXNzLiBDYW4gYmUgcmVzb2x2ZWQgYnkgdXNpbmcgTGluayBhbmQgc2V0dGluZyBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGluIHRoZSByZXF1ZXN0IHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiAgYE1JR1JBVEVEX0FDQ09VTlRfSVRFTWAgLSBJdGVtIGNyZWF0ZWQgdmlhIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCwgbGltaXRlZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICBgRVJST1JgIOKAkyBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gYW4gdW5zcGVjaWZpZWQgZXJyb3IuICBUaGUgZm9sbG93aW5nIGNvZGVzIGluZGljYXRlIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gd2FzIGBkZWNsaW5lZGA6ICBgTlNGYCDigJMgVHJhbnNhY3Rpb24gbGlrZWx5IHRvIHJlc3VsdCBpbiBhIHJldHVybiBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFJJU0tgIC0gVHJhbnNhY3Rpb24gaXMgaGlnaC1yaXNrLiAgYFRSQU5TRkVSX0xJTUlUX1JFQUNIRURgIC0gT25lIG9yIHNldmVyYWwgdHJhbnNmZXIgbGltaXRzIGFyZSByZWFjaGVkLCBlLmcuIG1vbnRobHkgdHJhbnNmZXIgbGltaXQuIENoZWNrIHRoZSBhY2NvbXBhbnlpbmcgYGRlc2NyaXB0aW9uYCBmaWVsZCB0byB1bmRlcnN0YW5kIHdoaWNoIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGUge1xuICAgIE5zZiA9ICdOU0YnLFxuICAgIFJpc2sgPSAnUklTSycsXG4gICAgVHJhbnNmZXJMaW1pdFJlYWNoZWQgPSAnVFJBTlNGRVJfTElNSVRfUkVBQ0hFRCcsXG4gICAgTWFudWFsbHlWZXJpZmllZEl0ZW0gPSAnTUFOVUFMTFlfVkVSSUZJRURfSVRFTScsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgUGF5bWVudFByb2ZpbGVMb2dpblJlcXVpcmVkID0gJ1BBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIE1pZ3JhdGVkQWNjb3VudEl0ZW0gPSAnTUlHUkFURURfQUNDT1VOVF9JVEVNJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2ZlciBpcyBndWFyYW50ZWVkIGJ5IFBsYWlkIChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLiBUaGlzIGZpZWxkIHdpbGwgY29udGFpbiBlaXRoZXIgYEdVQVJBTlRFRURgIG9yIGBOT1RfR1VBUkFOVEVFRGAgaW5kaWNhdGluZyB3aGV0aGVyIFBsYWlkIHdpbGwgZ3VhcmFudGVlIHRoZSB0cmFuc2Zlci4gSWYgdGhlIHRyYW5zZmVyIGlzIG5vdCBndWFyYW50ZWVkLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhlIGBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZC4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiBgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZWAgZm9yIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB7XG4gICAgR3VhcmFudGVlZCA9ICdHVUFSQU5URUVEJyxcbiAgICBOb3RHdWFyYW50ZWVkID0gJ05PVF9HVUFSQU5URUVEJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHRvIG5vdCBndWFyYW50ZWUgYSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBndWFyYW50ZWVfZGVjaXNpb25gIGlzIGBOT1RfR1VBUkFOVEVFRGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSB0cmFuc2ZlciBjYW5ub3QgYmUgZ3VhcmFudGVlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBQbGFpZCBkZWNsaW5lZCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2ZlcjogIGBSRVRVUk5fQkFOS2A6IFRoZSByaXNrIG9mIGEgYmFuay1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYW4gUjAxL05TRikgaXMgdG9vIGhpZ2ggdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXIuICBgUkVUVVJOX0NVU1RPTUVSYDogVGhlIHJpc2sgb2YgYSBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYSBSMTAvVW5hdXRob3JpemVkKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBHVUFSQU5URUVfTElNSVRfUkVBQ0hFRGA6IFRoaXMgdHJhbnNmZXIgaXMgbG93LXJpc2ssIGJ1dCBHdWFyYW50ZWUgaGFzIGV4aGF1c3RlZCBhbiBpbnRlcm5hbCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9yIHJhdGUgb2YgZ3VhcmFudGVlcyB0aGF0IGFwcGxpZXMgdG8gdGhpcyB0cmFuc2Zlci4gIGBSSVNLX0VTVElNQVRFX1VOQVZBSUxBQkxFYDogQSByaXNrIGVzdGltYXRlIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0uICBgUkVRVUlSRURfUEFSQU1fTUlTU0lOR2A6IFJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZSB7XG4gICAgUmV0dXJuQmFuayA9ICdSRVRVUk5fQkFOSycsXG4gICAgUmV0dXJuQ3VzdG9tZXIgPSAnUkVUVVJOX0NVU1RPTUVSJyxcbiAgICBHdWFyYW50ZWVMaW1pdFJlYWNoZWQgPSAnR1VBUkFOVEVFX0xJTUlUX1JFQUNIRUQnLFxuICAgIFJpc2tFc3RpbWF0ZVVuYXZhaWxhYmxlID0gJ1JJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEUnLFxuICAgIFJlcXVpcmVkUGFyYW1NaXNzaW5nID0gJ1JFUVVJUkVEX1BBUkFNX01JU1NJTkcnXG59XG5cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgdGhlIHNjb3JlcyBhbmQgcmlzayBsZXZlbC4gVGhpcyByZXNwb25zZSBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGUuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoZXNlIGZpZWxkcyBwbGVhc2UgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgYmVjYXVzZSBhbiBhY2NvdW50IGlzIG92ZXJkcmF3biBvciBiZWNhdXNlIGFuIGluZWxpZ2libGUgYWNjb3VudCBpcyB1c2VkIGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCAgXFxcIlIwOVxcXCIsIFxcXCJSMTNcXFwiLCBcXFwiUjE2XFxcIiwgXFxcIlIxN1xcXCIsIFxcXCJSMjBcXFwiLCBcXFwiUjIzXFxcIi4gVGhlc2UgcmV0dXJucyBoYXZlIGEgdHVybmFyb3VuZCB0aW1lIG9mIDIgYmFua2luZyBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Njb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC4gIFRoZSBzY29yZSBldmFsdWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdCBhbmQgY292ZXJzIHJldHVybiBjb2RlczogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJXaXJlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHdpcmVfZGV0YWlscz86IFRyYW5zZmVyV2lyZURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IHByZXNlbnQgaWYgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVkaXRfZnVuZHNfc291cmNlOiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xufVxuLyoqXG4gKiBDb21wcmlzZXMgZml2ZSByaXNrIGNhdGVnb3JpZXMgKGhpZ2ggcmlzaywgbWVkaXVtLWhpZ2ggcmlzaywgbWVkaXVtIHJpc2ssIG1lZGl1bS1sb3cgcmlzaywgbG93IHJpc2spIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBvZiByZXR1cm5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB7XG4gICAgSGlnaFJpc2sgPSAnSElHSF9SSVNLJyxcbiAgICBNZWRpdW1IaWdoUmlzayA9ICdNRURJVU1fSElHSF9SSVNLJyxcbiAgICBNZWRpdW1SaXNrID0gJ01FRElVTV9SSVNLJyxcbiAgICBNZWRpdW1Mb3dSaXNrID0gJ01FRElVTV9MT1dfUklTSycsXG4gICAgTG93UmlzayA9ICdMT1dfUklTSydcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci4gIElmIHRoZSBhY2NvdW50IGhhcyBtdWx0aXBsZSBhY2NvdW50IGhvbGRlcnMsIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIgb24gd2hvc2UgYmVoYWxmIHRoZSBhdXRob3JpemF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhlIGB1c2VyLmxlZ2FsX25hbWVgIGZpZWxkIGlzIHJlcXVpcmVkLiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgYXJlIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuIElmIHRoZSB1c2VyIGlzIGEgYnVzaW5lc3MsIHByb3ZpZGUgdGhlIGJ1c2luZXNzIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBiYWxhbmNlLCBwbHVzIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFsYW5jZS4gIGBwcmVmdW5kZWRfcnRwX2NyZWRpdHNgIC0gWW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJCYWxhbmNlVHlwZSB7XG4gICAgUnRwQ3JlZGl0cyA9ICdwcmVmdW5kZWRfcnRwX2NyZWRpdHMnLFxuICAgIEFjaENyZWRpdHMgPSAncHJlZnVuZGVkX2FjaF9jcmVkaXRzJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN1cHBvcnRlZCBzZXJ2aWNlIHR5cGVzIGluIFJUUFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbiBzdXBwb3J0cyBSVFAgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICAgICAqL1xuICAgIGNyZWRpdD86IGJvb2xlYW47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zdXBwb3J0ZWRfbmV0d29ya3M6IEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3M7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdXBwb3J0ZWQgc2VydmljZSB0eXBlcyBpbiBSZlBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZlBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUCB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24gc3VwcG9ydHMgUmZQIGRlYml0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUFxuICAgICAqL1xuICAgIGRlYml0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X2RhaWx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IGFuZCBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIGBhdXRob3JpemF0aW9uX2lkYCBpcyBub3cgdXNlZCBhcyBpZGVtcG90ZW5jeSBpbnN0ZWFkLiAgQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gVGhpcyBwYXJhbWV0ZXIgYWxzbyBzZXJ2ZXMgdGhlIHB1cnBvc2Ugb2YgYWN0aW5nIGFzIGFuIGlkZW1wb3RlbmN5IGlkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuIElmIHJlcHJvY2Vzc2luZyBhIHJldHVybmVkIHRyYW5zZmVyLCBwbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkIG11c3QgYmUgYFxcXCJSZXRyeSAxXFxcImAgb3IgYFxcXCJSZXRyeSAyXFxcImAgdG8gaW5kaWNhdGUgdGhhdCBpdFxcJ3MgYSByZXRyeSBvZiBhIHByZXZpb3VzbHkgcmV0dXJuZWQgdHJhbnNmZXIuIFlvdSBtYXkgcmV0cnkgYSB0cmFuc2ZlciB1cCB0byAyIHRpbWVzLCB3aXRoaW4gMTgwIGRheXMgb2YgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIHRyYW5zZmVyLiBPbmx5IHRyYW5zZmVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2l0aCBjb2RlIGBSMDFgIG9yIGBSMDlgIG1heSBiZSByZXRyaWVkLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1c2VyPzogVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYHRyYW5zZmVyYCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gZGVkdWN0IGZyb20gYHRyYW5zZmVyLmFtb3VudGAgYW5kIGRpc3RyaWJ1dGUgdG8gdGhlIHBsYXRmb3Jt4oCZcyBMZWRnZXIgYmFsYW5jZSBhcyBhIGZhY2lsaXRhdG9yIGZlZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGUgcmVtYWluZGVyIHdpbGwgZ28gdG8gdGhlIGVuZC1jdXN0b21lcuKAmXMgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGB0cmFuc2Zlci5hbW91bnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBub3cgZGVwcmVjYXRlZC4gWW91IG1heSBpZ25vcmUgaXQgZm9yIHRyYW5zZmVycyBjcmVhdGVkIG9uIGFuZCBhZnRlciAxMi8wMS8yMDIzLiAgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgZnVuZHMgZm9yIHRoZSB0cmFuc2Zlci4gT25seSB2YWxpZCBmb3IgYGNyZWRpdGAgdHJhbnNmZXJzLCBhbmQgZGVmYXVsdHMgdG8gYHN3ZWVwYCBpZiBub3Qgc3BlY2lmaWVkLiBUaGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGBkZWJpdGAgdHJhbnNmZXJzLiAgYHN3ZWVwYCAtIFN3ZWVwIGZ1bmRzIGZyb20geW91ciBmdW5kaW5nIGFjY291bnQgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgQUNIIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2Uge1xuICAgIFN3ZWVwID0gJ3N3ZWVwJyxcbiAgICBQcmVmdW5kZWRSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgUHJlZnVuZGVkQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGNyZWRpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgY3JlZGl0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9oaWdoZXN0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBhdmVyYWdlIGFtb3VudCBwZXIgY3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgbW9udGhseSBleHBlY3RlZCBBQ0ggY3JlZGl0IHByb2Nlc3NpbmcgYW1vdW50IGZvciB0aGUgbmV4dCA2LTEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBjcmVkaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gdGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lciwgZS5nLiBiaWxsIHBheW1lbnQgIGBcXFwid2ViXFxcImAgLSBBIGNyZWRpdCBFbnRyeSBpbml0aWF0ZWQgYnkgb3Igb24gYmVoYWxmIG9mIGEgaG9sZGVyIG9mIGEgQ29uc3VtZXIgQWNjb3VudCB0aGF0IGlzIGludGVuZGVkIGZvciBhIENvbnN1bWVyIEFjY291bnQgb2YgYSBSZWNlaXZlclxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VjX2NvZGVzOiBBcnJheTxDcmVkaXRBQ0hDbGFzcz47XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdXNhZ2Ugb2YgZGViaXRzLiBGb3IgYWxsIGRvbGxhciBhbW91bnRzLCB1c2UgYSBkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiB0aGUgb3JpZ2luYXRvciBpcyBleHBlY3RlZCB0byBwcm9jZXNzIGRlYml0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBkZWJpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGRlYml0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBtb250aGx5IGV4cGVjdGVkIEFDSCBkZWJpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBkZWJpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICAgICAqIEB0eXBlIHtBcnJheTxBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PEFDSENsYXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRvY3VtZW50IHRoYXQgeW91IHdhbnQgdG8gdXBsb2FkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZpbGUgdG8gdXBsb2FkLiBUaGUgZmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuIDIwTUIuIFN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnM6IC5wZGYuXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBmaWxlOiBhbnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRG9jdW1lbnRQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHB1cnBvc2U6IFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9y4oCZcyBkaWxpZ2VuY2Ugc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXMge1xuICAgIE5vdFN1Ym1pdHRlZCA9ICdub3Rfc3VibWl0dGVkJyxcbiAgICBTdWJtaXR0ZWQgPSAnc3VibWl0dGVkJyxcbiAgICBVbmRlclJldmlldyA9ICd1bmRlcl9yZXZpZXcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZW5pZWQgPSAnZGVuaWVkJyxcbiAgICBNb3JlSW5mb3JtYXRpb25SZXF1aXJlZCA9ICdtb3JlX2luZm9ybWF0aW9uX3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRpbGlnZW5jZSB0aGF0IHlvdSB3YW50IHRvIHN1Ym1pdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfZGlsaWdlbmNlOiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgdXBsb2FkZWQgZmlsZS4gIGBcXFwiRFVFX0RJTElHRU5DRVxcXCJgIC0gVGhlIHRyYW5zZmVyIGR1ZSBkaWxpZ2VuY2UgZG9jdW1lbnQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckRvY3VtZW50UHVycG9zZSB7XG4gICAgRHVlRGlsaWdlbmNlID0gJ0RVRV9ESUxJR0VOQ0UnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2Zlci4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgYG51bGxgIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09taXR0YWJsZVRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBPbWl0dGFibGVUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9hbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaWduZWQgYW1vdW50IG9mIGhvdyBtdWNoIHdhcyBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgIGZvciB0aGlzIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIi01LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2Ftb3VudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLiBBIG5vbi1udWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZXZlbnQgaXMgZm9yIHRoZSBhc3NvY2lhdGVkIHJlZnVuZCBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIHRyYW5zZmVyIHRoYXQgdGhpcyBldmVudCBhcHBsaWVzIHRvLiBPbmx5IHByZXNlbnQgaWYgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8vZnJvbSBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IFRyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZXM/OiBBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRpb24gYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciB0cmFuc2ZlcnMgZnJvbSBhIHNwZWNpZmljIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIGV2ZW50cyB0byBiZSBwdWxsZWQgZnJvbSB0aGUgZW5kcG9pbnQgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIGV2ZW50cyB0byBiZSBwdWxsZWQgZnJvbSB0aGUgZW5kcG9pbnQgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgdHJhbnNmZXIgcmVwcmVzZW50cy4gRXZlbnQgdHlwZXMgd2l0aCBwcmVmaXggYHN3ZWVwYCByZXByZXNlbnRzIGV2ZW50cyBmb3IgUGxhaWQgTGVkZ2VyIHN3ZWVwcy4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuICBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBieSB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pICBgcmV0dXJuZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuICBgc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHN3ZXB0IHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiAgYHJldHVybl9zd2VwdGA6IER1ZSB0byB0aGUgdHJhbnNmZXIgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVsbGVkIGZyb20gb3IgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlZXAucGVuZGluZ2A6IEEgbmV3IGxlZGdlciBzd2VlcCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgc3dlZXAucG9zdGVkYDogVGhlIGxlZGdlciBzd2VlcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgc3dlZXAuc2V0dGxlZGA6IFRoZSB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBpbiB0aGUgZnVuZGluZyBhY2NvdW50LiBUaGlzIG1lYW5zIHRoYXQgZnVuZHMgd2l0aGRyYXduIGZyb20gUGxhaWQgTGVkZ2VyIGJhbGFuY2UgaGF2ZSByZWFjaGVkIHRoZSBmdW5kaW5nIGFjY291bnQsIG9yIGZ1bmRzIHRvIGJlIGRlcG9zaXRlZCBpbnRvIHRoZSBQbGFpZCBMZWRnZXIgQmFsYW5jZSBoYXZlIGJlZW4gcHVsbGVkLCBhbmQgdGhlIGhvbGQgcGVyaW9kIGhhcyBiZWd1bi4gIGBzd2VlcC5yZXR1cm5lZGA6IEEgcG9zdGVkIGxlZGdlciBzd2VlcCB3YXMgcmV0dXJuZWQuICBgc3dlZXAuZmFpbGVkYDogVGhlIGxlZGdlciBzd2VlcCBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgc3dlZXAuZnVuZHNfYXZhaWxhYmxlYDogRnVuZHMgZnJvbSB0aGUgbGVkZ2VyIHN3ZWVwIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGRlYml0cy4gIGByZWZ1bmQucGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgcmVmdW5kLmNhbmNlbGxlZGA6IFRoZSByZWZ1bmQgd2FzIGNhbmNlbGxlZC4gIGByZWZ1bmQuZmFpbGVkYDogVGhlIHJlZnVuZCBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcmVmdW5kLnBvc3RlZGA6IFRoZSByZWZ1bmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHJlZnVuZC5zZXR0bGVkYDogVGhlIHJlZnVuZCB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBpbiB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuICBgcmVmdW5kLnJldHVybmVkYDogQSBwb3N0ZWQgcmVmdW5kIHdhcyByZXR1cm5lZC4gIGByZWZ1bmQuc3dlcHRgOiBUaGUgcmVmdW5kIHdhcyBzd2VwdCBmcm9tIHRoZSBzd2VlcCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHJlZnVuZCBiZWluZyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRXZlbnRUeXBlIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc2V0dGxlZCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgU3dlcHQgPSAnc3dlcHQnLFxuICAgIFN3ZXB0U2V0dGxlZCA9ICdzd2VwdF9zZXR0bGVkJyxcbiAgICBSZXR1cm5Td2VwdCA9ICdyZXR1cm5fc3dlcHQnLFxuICAgIFN3ZWVwUGVuZGluZyA9ICdzd2VlcC5wZW5kaW5nJyxcbiAgICBTd2VlcFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFN3ZWVwU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBTd2VlcFJldHVybmVkID0gJ3N3ZWVwLnJldHVybmVkJyxcbiAgICBTd2VlcEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnLFxuICAgIFN3ZWVwRnVuZHNBdmFpbGFibGUgPSAnc3dlZXAuZnVuZHNfYXZhaWxhYmxlJyxcbiAgICBSZWZ1bmRQZW5kaW5nID0gJ3JlZnVuZC5wZW5kaW5nJyxcbiAgICBSZWZ1bmRDYW5jZWxsZWQgPSAncmVmdW5kLmNhbmNlbGxlZCcsXG4gICAgUmVmdW5kRmFpbGVkID0gJ3JlZnVuZC5mYWlsZWQnLFxuICAgIFJlZnVuZFBvc3RlZCA9ICdyZWZ1bmQucG9zdGVkJyxcbiAgICBSZWZ1bmRTZXR0bGVkID0gJ3JlZnVuZC5zZXR0bGVkJyxcbiAgICBSZWZ1bmRSZXR1cm5lZCA9ICdyZWZ1bmQucmV0dXJuZWQnLFxuICAgIFJlZnVuZFN3ZXB0ID0gJ3JlZnVuZC5zd2VwdCcsXG4gICAgUmVmdW5kUmV0dXJuU3dlcHQgPSAncmVmdW5kLnJldHVybl9zd2VwdCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AuIElmIG11bHRpcGxlIHRyYW5zZmVyIGV2ZW50cyBvY2N1ciB3aXRoaW4gYSBzaW5nbGUgbWludXRlLCBvbmx5IG9uZSB3ZWJob29rIHdpbGwgYmUgZmlyZWQsIHNvIGEgc2luZ2xlIHdlYmhvb2sgaW5zdGFuY2UgbWF5IGNvcnJlc3BvbmQgdG8gbXVsdGlwbGUgdHJhbnNmZXIgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZWZpbmVzIGFuIGV4cGVjdGVkIHN3ZWVwIGRhdGUgYW5kIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVtZW50IGRhdGUgb2YgYSBzd2VlcCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgc3dlZXBfc2V0dGxlbWVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY3VtdWxhdGVkIGFtb3VudCB0aGF0IGhhcyBiZWVuIHN3ZXB0IGJ5IGBzd2VlcF9zZXR0bGVtZW50X2RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VwdF9zZXR0bGVkX2Ftb3VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIGV2ZW50IHR5cGUgZm9yIGEgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBmdW5kaW5nIGFjY291bnQsIGxpbmtlZCB3aXRoIFBsYWlkIExpbmsgb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgQVBQUk9WRURgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIHJlLWF1dGhlbnRpY2F0ZSB5b3VyIHVzZXIgd2hlbiBgZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCkuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBERUNMSU5FRGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgaW50ZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHRoZSB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJJbnRlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBmbG93IG9mIHRyYW5zZmVyIGZ1bmRzLiAgYFBBWU1FTlRgOiBUcmFuc2ZlcnMgZnVuZHMgZnJvbSBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudCB0byB5b3VyIGJ1c2luZXNzIGFjY291bnQuICBgRElTQlVSU0VNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20geW91ciBidXNpbmVzcyBhY2NvdW50IHRvIGFuIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlIHtcbiAgICBQYXltZW50ID0gJ1BBWU1FTlQnLFxuICAgIERpc2J1cnNlbWVudCA9ICdESVNCVVJTRU1FTlQnXG59XG5cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBEZWZhdWx0cyB0byBgc2FtZS1kYXktYWNoYC4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBhY2hgLCB0aGUgbmV4dC1kYXkgY3V0b2ZmIGlzIDg6MzAgUE0gRWFzdGVybiBUaW1lLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgdXNpbmcgYHNhbWUtZGF5LWFjaGAsIHRoZSBzYW1lLWRheSBjdXRvZmYgaXMgMzozMCBQTSBFYXN0ZXJuIFRpbWUuIElmIHRoZSB0cmFuc2ZlciBpcyBzdWJtaXR0ZWQgYWZ0ZXIgdGhpcyBjdXRvZmYgYnV0IGJlZm9yZSB0aGUgbmV4dC1kYXkgY3V0b2ZmLCBpdCB3aWxsIGJlIHNlbnQgb3ZlciBuZXh0LWRheSByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlcy4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBydHBgLCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhY2NvdW50IGJlaW5nIGNyZWRpdGVkIGRvZXMgbm90IHN1cHBvcnQgUlRQLCB0aGUgdHJhbnNmZXIgd2lsbCBiZSBzZW50IG92ZXIgQUNIIGFzIGxvbmcgYXMgYW4gYGFjaF9jbGFzc2AgaXMgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QuIElmIFJUUCBpc25cXCd0IHN1cHBvcnRlZCBieSB0aGUgYWNjb3VudCBhbmQgbm8gYGFjaF9jbGFzc2AgaXMgcHJvdmlkZWQsIHRoZSB0cmFuc2ZlciB3aWxsIGZhaWwgdG8gYmUgc3VibWl0dGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50Q3JlYXRlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJldHVybmVkIG9ubHkgaWYgYGFjY291bnRfaWRgIHdhcyBzZXQgb24gaW50ZW50IGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIGludGVudCBzdGF0dXMgaXMgYGZhaWxlZGAuIE51bGwgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24ge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQgKGkuZS4sIGFuIEFQSSBlcnJvciBvciB0aGUgYXV0aG9yaXphdGlvbiBiZWluZyBkZWNsaW5lZCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEdldH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudDogVHJhbnNmZXJJbnRlbnRHZXQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIGludGVudC4gIGBQRU5ESU5HYDogVGhlIHRyYW5zZmVyIGludGVudCBpcyBwZW5kaW5nLiBgU1VDQ0VFREVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIGBGQUlMRURgOiBUaGUgdHJhbnNmZXIgaW50ZW50IHdhcyB1bmFibGUgdG8gYmUgY3JlYXRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50U3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFN1Y2NlZWRlZCA9ICdTVUNDRUVERUQnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2Ugb2YgdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGlzIGJhbGFuY2UgYXZhaWxhYmxlIGZvciB1c2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHBlbmRpbmcgZnVuZHMgdGhhdCBhcmUgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBjdXN0b21lciB0aGF0IG93bnMgdGhlIExlZGdlciBiYWxhbmNlLiBUaGlzIGlzIHNvIFBsYWlkIGtub3dzIHdoaWNoIG9mIHlvdXIgY3VzdG9tZXJzIHRvIHBheW91dCBvciBjb2xsZWN0IGZ1bmRzLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtQbGF0Zm9ybSBjdXN0b21lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuIERvIG5vdCBpbmNsdWRlIGlmIHlvdeKAmXJlIHBheWluZyBvdXQgdG8geW91cnNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHRoZSBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBkZXBvc2l0IHRvLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBvc2l0aXZlIGFtb3VudCBvZiBob3cgbXVjaCB3aWxsIGJlIGRlcG9zaXRlZCBpbnRvIGxlZGdlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCI1LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciBkZXBvc2l0LiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgdGhlIHJlcXVlc3Qgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgZGVwb3NpdCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBQ0hOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJBQ0hOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExlZGdlciB0byBwdWxsIG1vbmV5IGZyb20uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyb21fbGVkZ2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExlZGdlciB0byBjcmVkaXQgbW9uZXkgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRvX2xlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gbW92ZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRpc3RyaWJ1dGUuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGlzdHJpYnV0ZSBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkaXN0cmlidXRlIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgbGVkZ2VyIGRpc3RyaWJ1dGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGxlZGdlciBiYWxhbmNlIHRvIGdldC4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgbGVkZ2VyX2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBMZWRnZXIgdGhhdCB3YXMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckxlZGdlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIExlZGdlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIExlZGdlciBpcyB0aGUgY2xpZW50XFwncyBkZWZhdWx0IGxlZGdlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2RlZmF1bHQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBsZWRnZXIgc3dlZXAgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAucG9zdGVkYCAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAuZmFpbGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5zZXR0bGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgIGBzd2VlcC5zZXR0bGVkYCAtLT4gYHN3ZWVwLnJldHVybmVkYCBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZSB7XG4gICAgUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgY3VzdG9tZXIgdGhhdCBvd25zIHRoZSBMZWRnZXIgYmFsYW5jZS4gVGhpcyBpcyBzbyBQbGFpZCBrbm93cyB3aGljaCBvZiB5b3VyIGN1c3RvbWVycyB0byBwYXlvdXQgb3IgY29sbGVjdCBmdW5kcy4gT25seSBhcHBsaWNhYmxlIGZvciBbUGxhdGZvcm0gY3VzdG9tZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLiBEbyBub3QgaW5jbHVkZSBpZiB5b3XigJlyZSBwYXlpbmcgb3V0IHRvIHlvdXJzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgdGhlIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBMZWRnZXIgd2lsbCBiZSB1c2VkLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwb3NpdGl2ZSBhbW91bnQgb2YgaG93IG11Y2ggd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGUgbGVkZ2VyIGJhbGFuY2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciB3aXRoZHJhdy4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciB3aXRoZHJhdyBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3aXRoZHJhdyBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyBhdXRob3JpemF0aW9uIHVzYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYWlseSBjcmVkaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBkYWlseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhaWx5IGRlYml0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgZGFpbHlfZGViaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgY3JlZGl0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgbW9udGhseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgZGViaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBtb250aGx5X2RlYml0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1vbnRobHlfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXR1cm5fcmF0ZXM/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX3VzYWdlPzogVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgcmV0dXJuIHJhdGVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzXG4gICAgICovXG4gICAgbGFzdF82MGQ/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHJldHVybiByYXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB7XG4gICAgLyoqXG4gICAgICogVGhlIG92ZXJhbGwgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICBvdmVyYWxsX3JldHVybl9yYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmF1dGhvcml6ZWQgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFkbWluaXN0cmF0aXZlIHJldHVybiByYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gICAgICovXG4gICAgYWRtaW5pc3RyYXRpdmVfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCBmb3IgdGhlIGNyZWF0ZWQgaXRlbSB0byBiZSBlbGlnaWJsZSBmb3Igd2lyZSB0cmFuc2ZlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXM7IHRoaXMgd2lsbCBhcHBseSB0byBib3RoIGxlZ3Mgb2YgdGhlIHRyYW5zZmVyIGlmIGFwcGxpY2FibGUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgcnRwYCwgIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSByb3V0ZSBiZXR3ZWVuIFJlYWwgVGltZSBQYXltZW50IHJhaWwgYnkgVENIIG9yIEZlZE5vdyByYWlscyBhcyBuZWNlc3NhcnkuIElmIGEgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFzIGBydHBgIGFuZCB0aGUgY291bnRlcnBhcnR5IGFjY291bnQgaXMgbm90IGVsaWdpYmxlIGZvciBSVFAsIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCByZXF1ZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGBJTlZBTElEX0ZJRUxEYCBlcnJvciBjb2RlLiBUbyBwcmUtY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb3VudGVycGFydHkgYWNjb3VudCBjYW4gc3VwcG9ydCBSVFAsIGNhbGwgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBiZWZvcmUgY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYC4gIFdpcmUgdHJhbnNmZXJzIGFyZSBjdXJyZW50bHkgaW4gZWFybHkgYXZhaWxhYmlsaXR5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byBgd2lyZWAgYXMgYSBwYXltZW50IG5ldHdvcmssIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGB3aXJlYCwgdGhlIGB0eXBlYCBtdXN0IGJlIGBjcmVkaXRgOyB3aXJlIGRlYml0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhlIGN1dG9mZiB0byBzdWJtaXQgYSB3aXJlIHBheW1lbnQgaXMgNDozMCBQTSBFYXN0ZXJuIFRpbWUgb24gYSBidXNpbmVzcyBkYXk7IHdpcmVzIHN1Ym1pdHRlZCBhZnRlciB0aGF0IHRpbWUgd2lsbCBiZSBwcm9jZXNzZWQgb24gdGhlIG5leHQgYnVzaW5lc3MgZGF5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCcsXG4gICAgV2lyZSA9ICd3aXJlJ1xufVxuXG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0d28tbGV0dGVyIGNvZGUgZm9yIHRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSAoZS5nLiwgXFxcIjk0MTAzXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGluIHB1YmxpYy1mYWNpbmcgc3VyZmFjZXMsIGUuZy4gUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3IuIFRoaXMgaWRlbnRpZmllciB3aWxsIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgYW5kIHNob3VsZCBiZSBzdG9yZWQgYXNzb2NpYXRlZCB3aXRoIGVuZCB1c2VyIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hdG9yLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRiYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggSUQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgdGF4X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBjcmVkaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZGViaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTkFJQ1MgY29kZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBuYWljc19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZ1bmRpbmdBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnQ6IFRyYW5zZmVyRnVuZGluZ0FjY291bnQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIgKGkuZS4gdGhlIG9yaWdpbmF0b3IpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXRhaWxlZE9yaWdpbmF0b3J9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcjogRGV0YWlsZWRPcmlnaW5hdG9yO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxPcmlnaW5hdG9yPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcnM6IEFycmF5PE9yaWdpbmF0b3I+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhbiBvbmJvYXJkaW5nIG9yaWdpbmF0b3IgaGFzIGJlZW4gdXBkYXRlZC4gQ2FsbCBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCB0byBjaGVjayB0aGUgbGF0ZXN0IHN0YXR1c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiVFJBTlNGRVJcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBcXFwiUExBVEZPUk1fT05CT0FSRElOR19VUERBVEVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRvc19hY2NlcHRhbmNlX21ldGFkYXRhOiBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIElTTzg2MDEgdGltZXN0YW1wIGluZGljYXRpbmcgdGhlIG1vc3QgcmVjZW50IHRpbWUgdGhlIHBsYXRmb3JtIGNvbGxlY3RlZCBvbmJvYXJkaW5nIGRhdGEgZnJvbSB0aGUgb3JpZ2luYXRvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfcmV2aWV3ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgUExBVEZPUk1fT05CT0FSRElOR19VUERBVEVgIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEhvbWUgYWRkcmVzcyBvZiBhIHBlcnNvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU/OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZTtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIGJpcnRoIG9mIHRoZSBwZXJzb24uIEZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBwZXJzb24gYW5kIHRoZSBvcmlnaW5hdG9yIHRoZXkgYXJlIHJlbGF0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxhdGlvbnNoaXBfdG9fb3JpZ2luYXRvcj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJRCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gc3VibWl0dGluZyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZXJzb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyc29uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIElEIG51bWJlciBvZiB0aGUgcGVyc29uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgdGhlIHBlcnNvblxcJ3MgSUQgTnVtYmVyLiBBbHBoYS1udW1lcmljLCB3aXRoIGFsbCBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgc3RyaXBwZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFRoZSBwZXJzb25cXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogQSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGlzIG91dHN0YW5kaW5nIGZvciB0aGUgc2NhbGVkIHBsYXRmb3JtIG9uYm9hcmRpbmcgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRcbiAgICAgKi9cbiAgICByZXF1aXJlbWVudF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVVSUQgb2YgdGhlIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVpcmVtZW50LiBPbmx5IHByZXNlbnQgZm9yIGluZGl2aWR1YWwtc2NvcGVkIHJlcXVpcmVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRcbiAgICAgKi9cbiAgICBwZXJzb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSByZXF1aXJlbWVudCBzdWJtaXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByZXF1aXJlbWVudCBiZWluZyBzdWJtaXR0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZW1lbnQsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhbiBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSBgcmVxdWlyZW1lbnRfdHlwZWAuIElmIGl0IGlzIGFuIG9iamVjdCwgdGhlIG9iamVjdCBzaG91bGQgYmUgSlNPTiBtYXJzaGFsZWQgaW50byBhIHN0cmluZy4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGVyc29uX2lkYCBvZiB0aGUgcGVyc29uIHRoZSByZXF1aXJlbWVudCBzdWJtaXNzaW9uIGlzIHJlbGF0ZWQgdG8uIEEgYHBlcnNvbl9pZGAgaXMgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYC4gVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGZvciByZXF1aXJlbWVudHMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gYSBwZXJzb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvblxuICAgICAqL1xuICAgIHBlcnNvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcmVxdWlyZW1lbnQgc3VibWlzc2lvbnMgdGhhdCBhbGwgcmVsYXRlIHRvIHRoZSBvcmlnaW5hdG9yLiBNdXN0IGNvbnRhaW4gYmV0d2VlbiAxIGFuZCA1MCByZXF1aXJlbWVudCBzdWJtaXNzaW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlbWVudF9zdWJtaXNzaW9uczogQXJyYXk8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvbj47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgYWNjZXB0YW5jZSBvZiBUZXJtcyBvZiBTZXJ2aWNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVE9TIGFncmVlbWVudCB3YXMgYWNjZXB0ZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICAgICAqL1xuICAgIGFncmVlbWVudF9hY2NlcHRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgb3JpZ2luYXRvciB3aGVuIHRoZXkgYWNjZXB0ZWQgdGhlIFRPUy4gRm9ybWF0dGVkIGFzIGFuIElQdjQgb3IgSVB2NiBJUCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfaXBfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTzg2MDEgdGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiB0aGUgb3JpZ2luYXRvciBhY2NlcHRlZCB0aGUgVE9TXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICAgICAqL1xuICAgIGFncmVlbWVudF9hY2NlcHRlZF9hdDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdGhlIGVuZCBjdXN0b21lciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgY29tcGxldGluZyBxdWVzdGlvbnMgaW4gUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVVJMIHRoYXQgeW91IHdpbGwgcmVkaXJlY3QgdGhlIGVuZCBjdXN0b21lciB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9uYm9hcmRpbmdfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVjdXJyaW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgcmVjdXJyaW5nIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgY3JlYXRlZCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gTmV3IG9yaWdpbmF0aW9ucyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBgdGVzdF9jbG9ja2AgYWR2YW5jZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyRGV2aWNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyPzogUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVjaXNpb25fcmF0aW9uYWxlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXI6IFJlY3VycmluZ1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2ZlcnM6IEFycmF5PFJlY3VycmluZ1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE5ldHdvcmtzIGVsaWdpYmxlIGZvciByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCdcbn1cblxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmUgZXhlY3V0ZWQgb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX3VuaXQ6IFRyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXQ7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgYGludGVydmFsX3VuaXRzYCBiZXR3ZWVuIG9yaWdpbmF0aW9ucy4gVGhlIHJlY3VycmluZyBpbnRlcnZhbCAoYmVmb3JlIGhvbGlkYXkgYWRqdXN0bWVudCkgaXMgY2FsY3VsYXRlZCBieSBtdWx0aXBseWluZyBgaW50ZXJ2YWxfdW5pdGAgYW5kIGBpbnRlcnZhbF9jb3VudGAuIEZvciBleGFtcGxlLCB0byBzY2hlZHVsZSBhIHJlY3VycmluZyB0cmFuc2ZlciB3aGljaCBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgdHdvIHdlZWtzLCBzZXQgYGludGVydmFsX3VuaXRgID0gYHdlZWtgIGFuZCBgaW50ZXJ2YWxfY291bnRgID0gMi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgdHJhbnNmZXIuICBJZiB0aGUgYGludGVydmFsX3VuaXRgIGlzIGB3ZWVrYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA1IChGcmlkYXkpLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgbW9udGhgLCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHRyYW5zZmVyIG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgdHJhbnNmZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHRyYW5zZmVyIG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLiAgVGhlIHRyYW5zZmVyIHdpbGwgYmUgb3JpZ2luYXRlZCBvbiB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaWYgdGhlIGRlc2lnbmF0ZWQgZGF5IGlzIGEgbm9uIGJhbmtpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBGb3IgYHJ0cGAgcmVjdXJyaW5nIHRyYW5zZmVycywgYHN0YXJ0X2RhdGVgIG11c3QgYmUgaW4gdGhlIGZ1dHVyZS4gT3RoZXJ3aXNlLCBpZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuICBgYWN0aXZlYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjdXJyZW50bHkgYWN0aXZlLiBgY2FuY2VsbGVkYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQgb3IgUGxhaWQuIGBleHBpcmVkYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciBoYXMgY29tcGxldGVkIGFsbCBvcmlnaW5hdGlvbnMgYWNjb3JkaW5nIHRvIGl0cyByZWN1cnJpbmcgc2NoZWR1bGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cyB7XG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZ1bmQgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zZmVyIHRvIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcmVmdW5kIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlZnVuZFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmRGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlclJlZnVuZEZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyByZWZ1bmQgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zZmVyIHRvIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHJlZnVuZCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHJlZnVuZC4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHJlZnVuZCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSByZWZ1bmQgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIGV2ZW50IHR5cGUgZm9yIGEgcmVmdW5kIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXR1cm5lZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmFpbHVyZSBjb2RlLCBlLmcuIGBSMDFgLiAgQSBmYWlsdXJlIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgcmVmdW5kIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBTZWUgW0FDSCByZXR1cm4gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2RlcyBhbmQgW1JUUCBlcnJvciBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI3J0cC1lcnJvci1jb2RlcykgZm9yIFJUUCBlcnJvciBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKi9cbiAgICBmYWlsdXJlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHJlZnVuZCBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgbW9yZSB2ZXJzYXRpbGUgYGZhaWx1cmVfY29kZWAsIHdoaWNoIGVuY29tcGFzc2VzIG5vbi1BQ0ggZmFpbHVyZSBjb2RlcyBhcyB3ZWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWZ1bmQuICBgcGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGhhdmUgYmVlbiByZWZ1bmRlZCB0byB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gYGZhaWxlZGA6IFRoZSByZWZ1bmQgaGFzIGZhaWxlZC4gYHJldHVybmVkYDogVGhlIHJlZnVuZCB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlZnVuZFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIEEgcmVwYXltZW50IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhZnRlciBvbmUgb3IgbW9yZSBndWFyYW50ZWVkIHRyYW5zYWN0aW9ucyByZWNlaXZlIGEgcmV0dXJuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxpZ2libGUgcmV0dXJucyBpbiBhIGRheSwgdGhleSBhcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlIHJlcGF5bWVudC4gIFJlcGF5bWVudHMgYXJlIHNlbnQgb3ZlciBBQ0gsIHdpdGggZnVuZHMgdHlwaWNhbGx5IGF2YWlsYWJsZSBvbiB0aGUgbmV4dCBiYW5raW5nIGRheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHJlcGF5bWVudCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlY2ltYWwgYW1vdW50IG9mIHRoZSByZXBheW1lbnQgYXMgaXQgYXBwZWFycyBvbiB5b3VyIGFjY291bnQgbGVkZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSByZXBheW1lbnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRzOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0dXJuIG9uIGEgR3VhcmFudGVlZCBBQ0ggdHJhbnNmZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBndWFyYW50ZWVkIHRyYW5zZmVyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYHJldHVybmVkYCB0cmFuc2ZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudCB0byBxdWVyeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnRzL3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9yZXR1cm5zOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gTm90ZSB0aGF0IGZ1bmRzIGZyb20gcmVjZWl2ZWQgZGViaXRzIGFyZSBub3QgYXZhaWxhYmxlIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgTGVkZ2VyIHVudGlsIHRoZSB0cmFuc2ZlciByZWFjaGVzIGBmdW5kc19hdmFpbGFibGVgIHN0YXR1cy4gRm9yIGNyZWRpdCB0cmFuc2FjdGlvbnMsIGBzZXR0bGVkYCBtZWFucyB0aGUgZnVuZHMgaGF2ZSBiZWVuIGRlbGl2ZXJlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgYWNjb3VudC4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBGdW5kc0F2YWlsYWJsZSA9ICdmdW5kc19hdmFpbGFibGUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHN3ZWVwIG9mIGZ1bmRzIHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIEEgc3dlZXAgaXMgYXNzb2NpYXRlZCB3aXRoIG1hbnkgc3dlZXAgZXZlbnRzIChldmVudHMgb2YgdHlwZSBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgKSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYHN3ZWVwX2lkYC4gIGBzd2VwdGAgZXZlbnRzIG9jY3VyIHdoZW4gdGhlIHRyYW5zZmVyIGFtb3VudCBpcyBjcmVkaXRlZCBvciBkZWJpdGVkIGZyb20geW91ciBzd2VlcCBhY2NvdW50LCBkZXBlbmRpbmcgb24gdGhlIGB0eXBlYCBvZiB0aGUgdHJhbnNmZXIuIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIGEgdHJhbnNmZXIgaXMgcmV0dXJuZWQgYW5kIFBsYWlkIHVuZG9lcyB0aGUgY3JlZGl0IG9yIGRlYml0LiAgVGhlIHRvdGFsIHN1bSBvZiB0aGUgYHN3ZXB0YCBhbmQgYHJldHVybl9zd2VwdGAgZXZlbnRzIGlzIGVxdWFsIHRvIHRoZSBgYW1vdW50YCBvZiB0aGUgc3dlZXAgUGxhaWQgY3JlYXRlcyBhbmQgbWF0Y2hlcyB0aGUgYW1vdW50IG9mIHRoZSBlbnRyeSBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFN3ZWVwRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3dlZXAgKFVVSUQpIG9yIGEgc2hvcnRlbmVkIGZvcm0gY29uc2lzdGluZyBvZiB0aGUgZmlyc3QgOCBjaGFyYWN0ZXJzIG9mIHRoZSBpZGVudGlmaWVyICg4LWRpZ2l0IGhleGFkZWNpbWFsIHN0cmluZykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzd2VlcHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBpbmNsdWRlZCBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PFRyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBzd2VlcCBmb3IgdGhlIHRyYW5zZmVyLiAgYHVuc3dlcHRgOiBUaGUgdHJhbnNmZXIgaGFzblxcJ3QgYmVlbiBzd2VwdCB5ZXQuIGBzd2VwdGA6IFRoZSB0cmFuc2ZlciB3YXMgc3dlcHQgdG8gdGhlIHN3ZWVwIGFjY291bnQuIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiBgcmV0dXJuX3N3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdWxsZWQgYmFjayBvciBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGRlYml0cy4gYG51bGxgOiBUaGUgdHJhbnNmZXIgd2lsbCBuZXZlciBiZSBzd2VwdCAoZS5nLiBpZiB0aGUgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIG9yIHJldHVybmVkIGJlZm9yZSBiZWluZyBzd2VwdClcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3dlZXBTdGF0dXMge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgVW5zd2VwdCA9ICd1bnN3ZXB0JyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHRlc3QgY2xvY2sgZm9yIGEgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJUZXN0Q2xvY2sge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeC4gXFxcIlNhbiBGcmFuY2lzY29cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gd2lyZSB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyV2lyZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlcldpcmVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpcmUgb3JpZ2luYXRvciB0byB0aGUgYmVuZWZpY2lhcnkuIE1heCAxNDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlcldpcmVEZXRhaWxzXG4gICAgICovXG4gICAgbWVzc2FnZV90b19iZW5lZmljaWFyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRydXN0ZWQgRGV2aWNlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmV2aW91cyBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRydXN0ZWREZXZpY2VEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJ1c3RlZERldmljZURhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0ZWREZXZpY2VEYXRhXG4gICAgICovXG4gICAgdHJ1c3RfbGV2ZWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RldmljZUlkfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdGVkRGV2aWNlRGF0YVxuICAgICAqL1xuICAgIGRldmljZV9pZD86IERldmljZUlkO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpZGVudGl0eSBkYXRhIHBlcm1pc3Npb25lZCBieSB0aGUgZW5kIHVzZXIgZHVyaW5nIHRoZSBhdXRob3JpemF0aW9uIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eU5hbWV9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lPzogVXNlckFjY291bnRJZGVudGl0eU5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLiAgTm90ZTogZW1haWwgaXMgY3VycmVudGx5IG5vdCByZXR1cm5lZCBmb3IgdXNlcnMsIGFuZCBpcyBhbiB1cGNvbWluZyBhZGRpdGlvbiB0aGF0IHdpbGwgYmUgbGl2ZSBpbiBlYXJseSAyMDI1LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGRhdGUgb2YgYmlydGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDQgZGlnaXRzIG9mIHRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc25fbGFzdF80Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kIGxpbmUgc3RyZWV0IGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5TmFtZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBJdGVtIGNyZWF0ZWQgZHVyaW5nIGEgTGF5ZXIgYXV0aG9yaXphdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYCB3ZWJob29rIGlzIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIENoYXNlIGFuZCBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRoYXQgYWxsb3cgYWNjb3VudC1sZXZlbCBwZXJtaXNzaW9ucyByZXZvY2F0aW9uIHRocm91Z2ggdGhlaXIgcG9ydGFscy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IFBsYWlkLWRlcml2ZWQgZGF0YSB5b3UgaGF2ZSBzdG9yZWQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJldm9rZWQgYWNjb3VudC4gIElmIHlvdSBhcmUgdXNpbmcgQXV0aCBhbmQgcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgdGhhdCB0aGUgVEFOIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV2b2tlZCBhY2NvdW50IGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIG5ldyB0cmFuc2ZlcnMuIFlvdSBzaG91bGQgbm90IGNyZWF0ZSBuZXcgQUNIIHRyYW5zZmVycyBmb3IgdGhlIGFjY291bnQgdGhhdCB3YXMgcmV2b2tlZCB1bnRpbCBhY2Nlc3MgaGFzIGJlZW4gcmUtZ3JhbnRlZC4gIFlvdSBjYW4gcmVxdWVzdCB0aGUgdXNlciB0byByZS1ncmFudCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBieSBzZW5kaW5nIHRoZW0gdGhyb3VnaCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBBbHRlcm5hdGl2ZWx5LCB0aGV5IG1heSByZS1ncmFudCBhY2Nlc3MgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiAgQWZ0ZXIgdGhlIHVzZXIgaGFzIHJlLWdyYW50ZWQgYWNjZXNzLCBBdXRoIGN1c3RvbWVycyBzaG91bGQgY2FsbCB0aGUgYXV0aCBlbmRwb2ludCBhZ2FpbiB0byBvYnRhaW4gdGhlIG5ldyBUQU4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfQUNDT1VOVF9SRVZPS0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBlbmQgdXNlciBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHk6IFVzZXJBY2NvdW50SWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxVc2VyQWNjb3VudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxVc2VyQWNjb3VudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgdXNlci4gU3VwcG9ydGVkIHZhbHVlcyBhcmU6IG5vdCBwcm92aWRlZCwgYWRkcmVzcyB3aXRoIG9ubHkgY291bnRyeSBjb2RlIG9yIGZ1bGwgYWRkcmVzcy4gIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuIElmIHByb3ZpZGVkLCBhIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDUwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgYSBDUkEgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGFPdmVydmlldyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLiBGb3Igc3BlY2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cyBieSBJRCB0eXBlLCBzZWUgW0h5YnJpZCBJbnB1dCBWYWxpZGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBVc2VySXRlbXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckl0ZW1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckl0ZW1zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbT59XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGAgd2ViaG9vayBtYXkgYmUgZmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBJZiB0aGUgZW5kIHVzZXIgcmV2b2tlZCB0aGVpciBwZXJtaXNzaW9ucyB0aHJvdWdoIFBsYWlkIChzdWNoIGFzIHZpYSB0aGUgUGxhaWQgUG9ydGFsIG9yIGJ5IGNvbnRhY3RpbmcgUGxhaWQgU3VwcG9ydCksIHRoZSB3ZWJob29rIHdpbGwgZmlyZS4gSWYgdGhlIGVuZCB1c2VyIHJldm9rZWQgdGhlaXIgcGVybWlzc2lvbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW5zdGl0dXRpb24sIHRoaXMgd2ViaG9vayBtYXkgbm90IGFsd2F5cyBmaXJlLCBzaW5jZSBzb21lIGluc3RpdHV0aW9uc+KAmSBjb25zZW50IHBvcnRhbHMgZG8gbm90IHRyaWdnZXIgdGhpcyB3ZWJob29rLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFRvIHJlc3RvcmUgdGhlIEl0ZW0sIGl0IGNhbiBiZSBzZW50IHRocm91Z2ggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgIE5vdGUgdGhhdCB3aGVuIHdvcmtpbmcgd2l0aCB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIHdpdGggQXV0aCBvciBUcmFuc2ZlciwgdGhlIGFjY291bnQgbnVtYmVyIHByb3ZpZGVkIGJ5IFBsYWlkIHdpbGwgbm8gbG9uZ2VyIHdvcmsgZm9yIGNyZWF0aW5nIHRyYW5zZmVycyBvbmNlIHVzZXIgcGVybWlzc2lvbiBoYXMgYmVlbiByZXZva2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBVc2VyUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlclJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIGNhdGVnb3J5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlQ2F0ZWdvcnkge1xuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBVbmVtcGxveW1lbnQgPSAnVU5FTVBMT1lNRU5UJyxcbiAgICBDYXNoID0gJ0NBU0gnLFxuICAgIEdpZ0Vjb25vbXkgPSAnR0lHX0VDT05PTVknLFxuICAgIFJlbnRhbCA9ICdSRU5UQUwnLFxuICAgIENoaWxkU3VwcG9ydCA9ICdDSElMRF9TVVBQT1JUJyxcbiAgICBNaWxpdGFyeSA9ICdNSUxJVEFSWScsXG4gICAgUmV0aXJlbWVudCA9ICdSRVRJUkVNRU5UJyxcbiAgICBMb25nVGVybURpc2FiaWxpdHkgPSAnTE9OR19URVJNX0RJU0FCSUxJVFknLFxuICAgIEJhbmtJbnRlcmVzdCA9ICdCQU5LX0lOVEVSRVNUJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgZnJlcXVlbmN5IG9mIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3kge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgdHlwZSAtIGBHUk9TU2AsIGBORVRgLCBvciBgVU5LTk9XTmAgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEdyb3NzID0gJ0dST1NTJyxcbiAgICBOZXQgPSAnTkVUJ1xufVxuXG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBBUEkgYGNsaWVudF9pZGAgb2YgdGhlIHRoaXJkLXBhcnR5IGNsaWVudCB0aGUgdG9rZW4gd2lsbCBiZSBzaGFyZWQgd2l0aC4gVGhlIHRva2VuIHdpbGwgb25seSBiZSB2YWxpZCBmb3IgdGhlIHNwZWNpZmllZCBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiBkYXRlIGFuZCB0aW1lIGZvciB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGUgZXhwaXJhdGlvbiBpcyByZXN0cmljdGVkIHRvIGEgbWF4aW11bSBvZiAyNCBob3VycyBmcm9tIHRoZSB0b2tlblxcJ3MgY3JlYXRpb24gdGltZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgdG9rZW4gd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGlyZSBhZnRlciAyNCBob3Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fdGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWYWxpZGF0aW9uU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VcbiAgICAgKi9cbiAgICBWYWxpZGF0aW9uU291cmNlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VSZWZlcmVuY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VmFsaWRhdGlvblNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VzXG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0U6IEFycmF5PFZhbGlkYXRpb25Tb3VyY2U+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHNldmVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IFJlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQXNzZXRzO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9OT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFN0YXR1c1VzZXJQcmVzZW5jZVJlcXVpcmVkID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEJyxcbiAgICBTdWNjZXNzZnVsID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUwnLFxuICAgIE5vdEZvdW5kID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZ5U01TRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVNNU0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZnlTTVNEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBWZXJpZnlTTVNEZXRhaWxzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhIHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlci1zdWJtaXR0ZWQgcGhvbmUgbnVtYmVyLiBQaG9uZSBudW1iZXIgZWRpdHMsIGFuZCBpbiBzb21lIGNhc2VzIGVycm9yIGhhbmRsaW5nIGR1ZSB0byBlZGdlIGNhc2VzIGxpa2UgcmF0ZSBsaW1pdGluZywgbWF5IGdlbmVyYXRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U01TVmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZ5U01TRGV0YWlsc1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbnM6IEFycmF5PFNNU1ZlcmlmaWNhdGlvbj47XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGB2ZXJpZnlfc21zYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnZlcmlmeV9zbXNgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZ5U01TRGV0YWlsc1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBzZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJPdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgc2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94Xzk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG90aGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlPjtcbn1cbi8qKlxuICogVzIgc3RhdGUgYW5kIGxvY2FsIHdhZ2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxpdHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xufVxuLyoqXG4gKiBXYWxsZXRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUsIHVzZWQgd2l0aCBlLXdhbGxldHMgYW5kIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldElTT0N1cnJlbmN5Q29kZSB7XG4gICAgR2JwID0gJ0dCUCcsXG4gICAgRXVyID0gJ0VVUidcbn1cblxuLyoqXG4gKiBXYWxsZXRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCBlLXdhbGxldCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gZS13YWxsZXRzIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZS13YWxsZXQuIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gZS13YWxsZXRzIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGUtd2FsbGV0cyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdhbGxldExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZS13YWxsZXRzXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldD59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldHM6IEFycmF5PFdhbGxldD47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IGUtd2FsbGV0IHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbElCQU59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgc2NoZW1lIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBBWU9VVGAgYW5kIGBSRUZVTkRgLiAgYEZBU1RFUl9QQVlNRU5UU2A6IFRoZSBzdGFuZGFyZCBwYXltZW50IHNjaGVtZSB3aXRoaW4gdGhlIFVLLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEZhc3RlclBheW1lbnRzID0gJ0ZBU1RFUl9QQVlNRU5UUycsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgd2FsbGV0LiAgYFVOS05PV05gOiBUaGUgd2FsbGV0IHN0YXR1cyBpcyB1bmtub3duLiAgYEFDVElWRWA6IFRoZSB3YWxsZXQgaXMgYWN0aXZlIGFuZCByZWFkeSB0byBzZW5kIG1vbmV5IHRvIGFuZCByZWNlaXZlIG1vbmV5IGZyb20uICBgQ0xPU0VEYDogVGhlIHdhbGxldCBpcyBjbG9zZWQuIEFueSB0cmFuc2FjdGlvbnMgbWFkZSB0byBvciBmcm9tIHRoaXMgd2FsbGV0IHdpbGwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgQ2xvc2VkID0gJ0NMT1NFRCdcbn1cblxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogV2FsbGV0VHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBpZCB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IGZvciB0cmFuc2FjdGlvbiB0eXBlcyBgUElTX1BBWV9JTmAgYW5kIGBSRUZVTkRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHdhbGxldCB0cmFuc2FjdGlvbnMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LlxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWxhdGVkX3RyYW5zYWN0aW9ucz86IEFycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWNhbGwgPSAnUkVDQUxMJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgZm9yIGEgV2FsbGV0IFRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDUztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsIHwgbnVsbDtcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuIEVuc3VyZSB0aGF0IHRoZSBgcmVmZXJlbmNlYCBmaWVsZCBpcyB1bmlxdWUgZm9yIGVhY2ggdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdGluZ0Z1bmRTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGluZ19mdW5kX3NvdXJjZT86IE9yaWdpbmF0aW5nRnVuZFNvdXJjZSB8IG51bGw7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVycm9yIGNvZGUgb2YgYSBmYWlsZWQgdHJhbnNhY3Rpb24uIEVycm9yIGNvZGVzIGluY2x1ZGU6IGBFWFRFUk5BTF9TWVNURU1gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIGRlY2xpbmVkIGJ5IGFuIGV4dGVybmFsIHN5c3RlbS4gYEVYUElSRURgOiBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBoYXMgZXhwaXJlZC4gYENBTkNFTExFRGA6IFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdhcyByZXNjaW5kZWQuIGBJTlZBTElEYDogVGhlIHRyYW5zYWN0aW9uIGRpZCBub3QgbWVldCBjZXJ0YWluIGNyaXRlcmlhLCBzdWNoIGFzIGFuIGluYWN0aXZlIGFjY291bnQgb3Igbm8gdmFsaWQgY291bnRlcnBhcnR5LCBldGMuIGBVTktOT1dOYDogVGhlIHRyYW5zYWN0aW9uIHdhcyB1bnN1Y2Nlc3NmdWwsIGJ1dCB0aGUgZXhhY3QgY2F1c2UgaXMgdW5rbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB7XG4gICAgRXh0ZXJuYWxTeXN0ZW0gPSAnRVhURVJOQUxfU1lTVEVNJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnLFxuICAgIENhbmNlbGxlZCA9ICdDQU5DRUxMRUQnLFxuICAgIEludmFsaWQgPSAnSU5WQUxJRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygd2FsbGV0IHRyYW5zYWN0aW9ucyB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXRlZF90cmFuc2FjdGlvbnM/OiBBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWNhbGwgPSAnUkVDQUxMJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0byBmZXRjaCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgdHJhbnNhY3Rpb24uIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gdHJhbnNhY3Rpb25zIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIHdhbGxldCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUaGg6bW06c3NaKSBmb3IgZmlsdGVyaW5nIHRyYW5zYWN0aW9ucywgaW5jbHVzaXZlIG9mIHRoZSBwcm92aWRlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHRyYW5zYWN0aW9ucyBvZiBhbiBlLXdhbGxldCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgd2FsbGV0X2lkYFxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxXYWxsZXRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zIGFyZSByZWxhdGVkIHdoZW4gdGhleSBoYXZlIGEgbG9naWNhbCBjb25uZWN0aW9uLiAgRm9yIGV4YW1wbGUsIGEgYFBBWU9VVGAgdHJhbnNhY3Rpb24gY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBzZW5kZXIsIGNyZWF0aW5nIGEgYFJFVFVSTmAgdHJhbnNhY3Rpb24uIEVhY2ggYFBBWU9VVGAgdHJhbnNhY3Rpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgY29ycmVzcG9uZGluZyBgUkVUVVJOYCB0cmFuc2FjdGlvbiBpbiBjYXNlIG9mIHJldmVyc2FsLiAgVGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgYmktZGlyZWN0aW9uYWwsIG1lYW5pbmcgdGhhdCBib3RoIGVudGl0aWVzIGhhdmUgcmVmZXJlbmNlcyB0byBlYWNoIG90aGVyLiBGb3IgaW5zdGFuY2UsIHdoZW4gYSB0cmFuc2FjdGlvbiBvZiB0eXBlIFJFVFVSTiBvY2N1cnMsIGl0IGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gYmVpbmcgcmV0dXJuZWQuIExpa2V3aXNlLCB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gaGFzIGEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFJFVFVSTiB0cmFuc2FjdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIHJldHVybi4gICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciB0cmFuc2FjdGlvbnMgb2YgdHlwZSBgUkVUVVJOYCwgYEZVTkRTX1NXRUVQYCwgYFJFRlVORGAgYW5kIGBQQVlPVVRgLiAgVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgYFBJU19QQVlfSU5gIHBheW1lbnQgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGBSRUZVTkRgIHRyYW5zYWN0aW9ucyBpcyBvbmx5IGF2YWlsYWJsZSB0aHJvdWdoIGByZWZ1bmRfaWRzYCBwcm9wZXJ0eSBpbiB0aGUgcGF5bWVudCBvYmplY3QuIFNlZVtgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtZ2V0LXJlc3BvbnNlLXJlZnVuZC1pZHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWxhdGVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb25cbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblxuICAgICAqL1xuICAgIHR5cGU/OiBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblR5cGVFbnVtIHtcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0byBmZXRjaCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGF0IHRyYW5zYWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRyYW5zYWN0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGFuIEFzc2V0IFJlcG9ydCB0byBiZSByZXR1cm5lZCB3aXRoIG1pc3NpbmcgYWNjb3VudCBvd25lciBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gd2FybmluZyBkYXRhIGluIHRoZSByZXNwb25zZSwgaW5kaWNhdGluZyB3aHkgb2J0YWluaW5nIHRoZSBvd25lciBpbmZvcm1hdGlvbiBmYWlsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQVNTRVRfUkVQT1JUX1dBUk5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLmBJTlZFU1RNRU5UU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgSW52ZXN0bWVudHMgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgdHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IFdhcm5pbmdXYXJuaW5nQ29kZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYXJuaW5nV2FybmluZ0NvZGVFbnVtIHtcbiAgICBPd25lcnNVbmF2YWlsYWJsZSA9ICdPV05FUlNfVU5BVkFJTEFCTEUnLFxuICAgIEludmVzdG1lbnRzVW5hdmFpbGFibGUgPSAnSU5WRVNUTUVOVFNfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjaGFuZ2UgbWFkZSB0byB0aGUgcGFyZW50IG9iamVjdCBzcGVjaWZ5aW5nIHdoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyB3aGVuIGl0IG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHNvdXJjZTogU291cmNlO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9mZmljaWFsIGRvY3VtZW50LCB1c3VhbGx5IGlzc3VlZCBieSBhIGdvdmVybmluZyBib2R5IG9yIGluc3RpdHV0aW9uLCB3aXRoIGFuIGFzc29jaWF0ZWQgaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAgICAgKi9cbiAgICB0eXBlOiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaXJ0aF9jZXJ0aWZpY2F0ZWAgLSBBIGNlcnRpZmljYXRlIG9mIGJpcnRoICBgZHJpdmVyc19saWNlbnNlYCAtIEEgbGljZW5zZSB0byBvcGVyYXRlIGEgbW90b3IgdmVoaWNsZSAgYGltbWlncmF0aW9uX251bWJlcmAgLSBJbW1pZ3JhdGlvbiBvciByZXNpZGVuY2UgZG9jdW1lbnRzICBgbWlsaXRhcnlfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGJ5IGEgbWlsaXRhcnkgZ3JvdXAgIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHBhc3Nwb3J0YCAtIEFuIG9mZmljaWFsIHBhc3Nwb3J0IGlzc3VlIGJ5IGEgZ292ZXJubWVudCAgYHBlcnNvbmFsX2lkZW50aWZpY2F0aW9uYCAtIEFueSBnZW5lcmljIHBlcnNvbmFsIGlkZW50aWZpY2F0aW9uIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHJhdGlvbl9jYXJkYCAtIElkZW50aWZpY2F0aW9uIHRoYXQgZW50aXRsZXMgdGhlIGhvbGRlciB0byByYXRpb25zICBgc3NuYCAtIFVuaXRlZCBTdGF0ZXMgU29jaWFsIFNlY3VyaXR5IE51bWJlciAgYHN0dWRlbnRfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGJ5IGFuIGVkdWNhdGlvbmFsIGluc3RpdHV0aW9uICBgdGF4X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgY29sbGVjdGluZyB0YXhlcyAgYHRyYXZlbF9kb2N1bWVudGAgLSBWaXNhcywgZW50cnkgcGVybWl0cywgcmVmdWdlZSBkb2N1bWVudHMsIGV0Yy4gIGB2b3Rlcl9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIHZvdGluZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlIHtcbiAgICBCaXJ0aENlcnRpZmljYXRlID0gJ2JpcnRoX2NlcnRpZmljYXRlJyxcbiAgICBEcml2ZXJzTGljZW5zZSA9ICdkcml2ZXJzX2xpY2Vuc2UnLFxuICAgIEltbWlncmF0aW9uTnVtYmVyID0gJ2ltbWlncmF0aW9uX251bWJlcicsXG4gICAgTWlsaXRhcnlJZCA9ICdtaWxpdGFyeV9pZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBQZXJzb25hbElkZW50aWZpY2F0aW9uID0gJ3BlcnNvbmFsX2lkZW50aWZpY2F0aW9uJyxcbiAgICBSYXRpb25DYXJkID0gJ3JhdGlvbl9jYXJkJyxcbiAgICBTc24gPSAnc3NuJyxcbiAgICBTdHVkZW50SWQgPSAnc3R1ZGVudF9pZCcsXG4gICAgVGF4SWQgPSAndGF4X2lkJyxcbiAgICBUcmF2ZWxEb2N1bWVudCA9ICd0cmF2ZWxfZG9jdW1lbnQnLFxuICAgIFZvdGVySWQgPSAndm90ZXJfaWQnXG59XG5cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYW4gZW50aXR5IHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBoaXRzIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdD59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2hpdHM6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSByZXZpZXcgZm9yIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWVsZHMgdG8gcmVzZXQgYmFjayB0byBudWxsXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVzZXRfZmllbGRzPzogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZD4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZpZWxkIHRoYXQgY2FuIGJlIHJlc2V0IGJhY2sgdG8gbnVsbFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3Qgb3IgUEVQIGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZyBoaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICByZXZpZXdfc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGZpcnN0X2FjdGl2ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpbmFjdGl2ZV9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogSW5kaXZpZHVhbFdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IFNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIExvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBsb2NhdGlvbiBzdHJpbmcsIHBvdGVudGlhbGx5IGluY2x1ZGluZyBlbGVtZW50cyBsaWtlIHN0cmVldCwgY2l0eSwgcG9zdGFsIGNvZGVzIGFuZCBjb3VudHJ5IGNvZGVzLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYSBjb21wbGV0ZSBvciB3ZWxsLWZvcm1hdHRlZCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgcmV2aWV3LiBBbGwgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzIGJlZ2luIGluIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0ZSBidXQgY2FuIGJlIGNoYW5nZWQgYnkgY3JlYXRpbmcgYSByZXZpZXcuIFdoZW4gYSBoaXQgaXMgaW4gdGhlIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUsIGl0IHdpbGwgYWx3YXlzIHNob3cgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSB3YXRjaGxpc3QgZGF0YSBQbGFpZCBoYXMgYXZhaWxhYmxlIGFuZCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBsYXRlc3QgY3VzdG9tZXIgaW5mb3JtYXRpb24gc2F2ZWQgaW4gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcuIE9uY2UgYSBoaXQgaGFzIGJlZW4gbWFya2VkIGFzIGBjb25maXJtZWRgIG9yIGBkaXNtaXNzZWRgIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIHVwZGF0ZWQgc28gdGhhdCB0aGUgc3RhdGUgaXMgYXMgaXQgd2FzIHdoZW4gdGhlIHJldmlldyB3YXMgZmlyc3QgY29uZHVjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzIHtcbiAgICBDb25maXJtZWQgPSAnY29uZmlybWVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBEaXNtaXNzZWQgPSAnZGlzbWlzc2VkJ1xufVxuXG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBjaGFuZ2VzIHRvIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgaGl0cyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmdpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtcyBmb3IgaW5kaXZpZHVhbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1zOiBBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21tZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyByZXZpZXdzIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIHNjcmVlbmluZyByZXZpZXdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHNjcmVlbmluZyByZXZpZXdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX3Jldmlld3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZWRpdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtcz86IFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JldmlldyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgY3JlYXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgc2NyZWVuaW5nIGlzIHN0aWxsIHBlbmRpbmcgcmV2aWV3LCBoYXMgYmVlbiByZWplY3RlZCwgb3IgaGFzIGJlZW4gY2xlYXJlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cyB7XG4gICAgUmVqZWN0ZWQgPSAncmVqZWN0ZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIENsZWFyZWQgPSAnY2xlYXJlZCdcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGF0IGFyZSBleHBsaWNpdGx5IG1hcmtlZCBhcyBsb3cgcXVhbGl0eSBlaXRoZXIgYnkgdGhlaXIgYHNvdXJjZWAgbGlzdCwgb3IgYnkgYHBsYWlkYCBieSBhIHNlcmllcyBvZiBhZGRpdGlvbmFsIGNoZWNrcyBkb25lIGJ5IFBsYWlkLiBQbGFpZCBkb2VzIG5vdCBldmVyIHN1cmZhY2UgYSBoaXQgYXMgYSByZXN1bHQgb2YgYSB3ZWFrIG5hbWUgYWxvbmUuIElmIGEgbmFtZSBoYXMgbm8gcXVhbGl0eSBpc3N1ZXMsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbm9uZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uIHtcbiAgICBOb25lID0gJ25vbmUnLFxuICAgIFNvdXJjZSA9ICdzb3VyY2UnLFxuICAgIFBsYWlkID0gJ3BsYWlkJ1xufVxuXG4vKipcbiAqIFRoZSBQbGFpZCBlbnZpcm9ubWVudCB0aGUgd2ViaG9vayB3YXMgc2VudCBmcm9tXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXMge1xuICAgIFNhbmRib3ggPSAnc2FuZGJveCcsXG4gICAgUHJvZHVjdGlvbiA9ICdwcm9kdWN0aW9uJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIHR5cGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdlYmhvb2tUeXBlIHtcbiAgICBBdXRoID0gJ0FVVEgnLFxuICAgIEhvbGRpbmdzID0gJ0hPTERJTkdTJyxcbiAgICBJbnZlc3RtZW50c1RyYW5zYWN0aW9ucyA9ICdJTlZFU1RNRU5UU19UUkFOU0FDVElPTlMnLFxuICAgIEl0ZW0gPSAnSVRFTScsXG4gICAgTGlhYmlsaXRpZXMgPSAnTElBQklMSVRJRVMnLFxuICAgIFRyYW5zYWN0aW9ucyA9ICdUUkFOU0FDVElPTlMnLFxuICAgIEFzc2V0cyA9ICdBU1NFVFMnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB3ZWJob29rIGlzIHVwZGF0ZWQuIFRoaXMgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IElEICggYGtpZGAgKSBmcm9tIHRoZSBKV1QgaGVhZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAga2V5X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SldLUHVibGljS2V5fVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBrZXk6IEpXS1B1YmxpY0tleTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgcHJlLXRheCBlYXJuaW5ncywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCBhIGZpeGVkIGluY29tZSBzZWN1cml0eVxcJ3MgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlpZWxkUmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlpZWxkUmF0ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpeGVkIGluY29tZSBzZWN1cml0eVxcJ3MgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWWllbGRSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZaWVsZFJhdGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBZaWVsZFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBZaWVsZFJhdGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgcmF0ZSB3aGljaCBpbmRpY2F0ZXMgaG93IHRoZSBwcmVkaWN0ZWQgeWllbGQgd2FzIGNhbGN1bGF0ZWQuIEl0IGlzIG9uZSBvZjogIGBjb3Vwb25gOiB0aGUgYW5udWFsaXplZCBpbnRlcmVzdCByYXRlIGZvciBzZWN1cml0aWVzIHdpdGggYSBvbmUteWVhciB0ZXJtIG9yIGxvbmdlciwgc3VjaCBhcyB0cmVhc3VyeSBub3RlcyBhbmQgYm9uZHMuICBgY291cG9uX2VxdWl2YWxlbnRgOiB0aGUgY2FsY3VsYXRlZCBlcXVpdmFsZW50IGZvciB0aGUgYW5udWFsaXplZCBpbnRlcmVzdCByYXRlIGZhY3RvcmluZyBpbiB0aGUgZGlzY291bnQgcmF0ZSBhbmQgdGltZSB0byBtYXR1cml0eSwgZm9yIHNob3J0ZXIgdGVybSwgbm9uLWludGVyZXN0LWJlYXJpbmcgc2VjdXJpdGllcyBzdWNoIGFzIHRyZWFzdXJ5IGJpbGxzLiAgYGRpc2NvdW50YDogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIHByZXNlbnQgdmFsdWUgb3IgY29zdCBpcyBkaXNjb3VudGVkIGZyb20gdGhlIGZ1dHVyZSB2YWx1ZSB1cG9uIG1hdHVyaXR5LCBhbHNvIGtub3duIGFzIHRoZSBmYWNlIHZhbHVlLiAgYHlpZWxkYDogdGhlIHRvdGFsIHByZWRpY3RlZCByYXRlIG9mIHJldHVybiBmYWN0b3JpbmcgaW4gYm90aCB0aGUgZGlzY291bnQgcmF0ZSBhbmQgdGhlIGNvdXBvbiByYXRlLCBhcHBsaWNhYmxlIHRvIHNlY3VyaXRpZXMgc3VjaCBhcyBleGNoYW5nZS10cmFkZWQgYm9uZHMgd2hpY2ggY2FuIGJvdGggYmUgaW50ZXJlc3QtYmVhcmluZyBhcyB3ZWxsIGFzIHNvbGQgYXQgYSBkaXNjb3VudCBvZmYgaXRzIGZhY2UgdmFsdWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBZaWVsZFJhdGVUeXBlIHtcbiAgICBDb3Vwb24gPSAnY291cG9uJyxcbiAgICBDb3Vwb25FcXVpdmFsZW50ID0gJ2NvdXBvbl9lcXVpdmFsZW50JyxcbiAgICBEaXNjb3VudCA9ICdkaXNjb3VudCcsXG4gICAgWWllbGQgPSAneWllbGQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQ6IGFzeW5jIChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzQmFsYW5jZUdldCcsICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JywgYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0OiBhc3luYyAoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0dldCcsICdhY2NvdW50c0dldFJlcXVlc3QnLCBhY2NvdW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldDogYXN5bmMgKGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXBwbGljYXRpb25HZXQnLCAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JywgYXBwbGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hcHBsaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUdldCcsICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRDcmVhdGU6IGFzeW5jIChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0Q3JlYXRlJywgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXI6IGFzeW5jIChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0RmlsdGVyJywgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcsIGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEdldCcsICdhc3NldFJlcG9ydEdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQ6IGFzeW5jIChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UGRmR2V0JywgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlZnJlc2g6IGFzeW5jIChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVmcmVzaCcsICdhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlOiBhc3luYyAoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydFJlbW92ZScsICdhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QnLCBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldDogYXN5bmMgKGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aEdldCcsICdhdXRoR2V0UmVxdWVzdCcsIGF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0JywgJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNhbmNlbDogYXN5bmMgKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQ2FuY2VsJywgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNyZWF0ZScsICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJFdmVudExpc3QnLCAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRTeW5jOiBhc3luYyAoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJFdmVudFN5bmMnLCAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyR2V0JywgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJMaXN0JywgJ2JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQ6IGFzeW5jIChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcsIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldDogYXN5bmMgKGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyU3dlZXBHZXQnLCAnYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdDogYXN5bmMgKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyU3dlZXBMaXN0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGU6IGFzeW5jIChiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdDogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUnLCAnYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QnLCBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQ6IGFzeW5jIChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvbkR1cGxpY2F0ZUdldCcsICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JywgYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL2R1cGxpY2F0ZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0Q3JlYXRlOiBhc3luYyAoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRDcmVhdGUnLCAnYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRHZXQ6IGFzeW5jIChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydEdldCcsICdiZWFjb25SZXBvcnRHZXRSZXF1ZXN0JywgYmVhY29uUmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0TGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0TGlzdCcsICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcsIGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQ6IGFzeW5jIChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCcsIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3Q6IGFzeW5jIChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdCcsICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0JywgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3R9IGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldDogYXN5bmMgKGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldCcsICdiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCcsIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9hY2NvdW50X2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGU6IGFzeW5jIChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJDcmVhdGUnLCAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0OiBhc3luYyAoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyR2V0JywgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JywgYmVhY29uVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBCZWFjb24gVXNlciBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VySGlzdG9yeUxpc3Q6IGFzeW5jIChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJIaXN0b3J5TGlzdCcsICdiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0JywgYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3OiBhc3luYyAoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyUmV2aWV3JywgJ2JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0JywgYmVhY29uVXNlclJldmlld1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL3Jldmlld2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGU6IGFzeW5jIChiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJVcGRhdGUnLCAnYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldDogYXN5bmMgKGJvZHk6IG9iamVjdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdib2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXRlZ29yaWVzR2V0JywgJ2JvZHknLCBib2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jYXRlZ29yaWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChib2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBJdGVtIGNvbnNlbnQgZXZlbnRzLiBDb25zZW50IGxvZ3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBldmVudHMgb2NjdXJyaW5nIG9uIG9yIGFmdGVyIE5vdmVtYmVyIDcsIDIwMjQuIFVwIHRvIHRocmVlIHllYXJzIG9mIGNvbnNlbnQgbG9ncyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgdGhlIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0fSBjb25zZW50RXZlbnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnNlbnRFdmVudHNHZXQ6IGFzeW5jIChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY29uc2VudEV2ZW50c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NvbnNlbnRFdmVudHNHZXQnLCAnY29uc2VudEV2ZW50c0dldFJlcXVlc3QnLCBjb25zZW50RXZlbnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY29uc2VudC9ldmVudHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyBhbGwgZXhpc3RpbmcgQ1JCIEJhbmsgSW5jb21lIGFuZCBCYXNlIHJlcG9ydHMgZm9yIHRoZSBjb25zdW1lciBpbiBQREYgZm9ybWF0LiAgUmVzcG9uc2UgaXMgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBSZXBvcnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdW1lclJlcG9ydFBkZkdldDogYXN5bmMgKGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY29uc3VtZXJSZXBvcnRQZGZHZXQnLCAnY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0JywgY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jb25zdW1lcl9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYCBjcmVhdGVzIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3R9IGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUNyZWF0ZTogYXN5bmMgKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0OiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQmFua0luY29tZUNyZWF0ZScsICdjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCcsIGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lR2V0OiBhc3luYyAoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFCYW5rSW5jb21lR2V0JywgJ2NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0JywgY3JhQmFua0luY29tZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9iYW5rX2luY29tZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0JywgJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cywgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9jYXNoZmxvd19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgaW5zaWdodHMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHBhcmFtZXRlcnMgdW5kZXIgYG9wdGlvbnNgIHRvIGNvbmZpZ3VyZSB3aGljaCBpbnNpZ2h0cyB5b3Ugd2FudCB0byByZWNlaXZlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9jYXNoZmxvd19pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlOiBhc3luYyAoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDaGVja1JlcG9ydENyZWF0ZScsICdjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9uZXR3b3JrX2F0dHJpYnV0ZXNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZXMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGF0dHJpYnV0ZXMgZm9yIHRoZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L25ldHdvcmtfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L3BhcnRuZXJfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlIG1vc3QgcmVjZW50IEJhc2UgUmVwb3J0IChpZiBpdCBleGlzdHMpIGZvciB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkLiBUbyByZXF1ZXN0IHRoYXQgdGhlIG1vc3QgcmVjZW50IEluY29tZSBJbnNpZ2h0cyByZXBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIFBERiBhcyB3ZWxsLCB1c2UgdGhlIGBhZGQtb25zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQ29uc3VtZXIgUmVwb3J0cyBhcyBhIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQZGZHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0UGRmR2V0JywgJ2NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXI6IGFzeW5jIChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXInLCAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1JlZ2lzdGVyOiBhc3luYyAoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1JlZ2lzdGVyJywgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JywgY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVW5yZWdpc3RlcjogYXN5bmMgKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTG9hbnNVbnJlZ2lzdGVyJywgJ2NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlOiBhc3luYyAoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1VwZGF0ZScsICdjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QnLCBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0OiBhc3luYyAoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCcsIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBpdGVtcywgd2hpY2ggYXJlIHVwZGF0ZWQgZXZlcnkgZGF5IChiZXN0LWVmZm9ydCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZTogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlJywgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QnLCBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZTogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0JywgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhUGFydG5lckluc2lnaHRzR2V0JywgJ2NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVHZXQnLCAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVQZGZHZXQnLCAnY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLiBJZiB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGlzIG5vIGxvbmdlciB2YWxpZCAoaS5lLiBkZWxldGVkKSwgdGhlIGVuZHBvaW50IHdpbGwgcmVmcmVzaCB0aGUgbW9zdCByZWNlbnQgdmFsaWQgcmVwb3J0IGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlOiBhc3luYyAoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZScsICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0JywgJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JywgY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0OiBhc3luYyAoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldCcsICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnLCBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVHZXQnLCAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGU6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2s6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjaycsICdjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlOiBhc3luYyAoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUNyZWF0ZScsICdjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5R2V0OiBhc3luYyAoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUdldCcsICdjcmVkaXRSZWxheUdldFJlcXVlc3QnLCBjcmVkaXRSZWxheUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVBkZkdldDogYXN5bmMgKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlQZGZHZXQnLCAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JywgY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVtb3ZlOiBhc3luYyAoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVJlbW92ZScsICdjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QnLCBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcsIGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldDogYXN5bmMgKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0U2Vzc2lvbnNHZXQnLCAnY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0JywgY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0OiBhc3luYyAoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyR2V0JywgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdDogYXN5bmMgKGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGFzaGJvYXJkVXNlckxpc3QnLCAnZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kYXNoYm9hcmRfdXNlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaENyZWF0ZScsICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoR2V0OiBhc3luYyAoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoR2V0JywgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldCcsICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRJZCBSZWNpcGllbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50OiBhc3luYyAocmVjaXBpZW50SWQ6IHN0cmluZywgb0FVVEhTVEFURUlEPzogc3RyaW5nLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlY2lwaWVudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdnZXRSZWNpcGllbnQnLCAncmVjaXBpZW50SWQnLCByZWNpcGllbnRJZClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L3JlY2lwaWVudC97cmVjaXBpZW50SWR9YFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcInJlY2lwaWVudElkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcocmVjaXBpZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChvQVVUSFNUQVRFSUQgIT09IHVuZGVmaW5lZCAmJiBvQVVUSFNUQVRFSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnT0FVVEgtU1RBVEUtSUQnXSA9IFN0cmluZyhvQVVUSFNUQVRFSUQpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50czogYXN5bmMgKG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZHgvcmVjaXBpZW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHRvIHJldHJpZXZlIGlkZW50aXR5IGRldGFpbHMgd2hlbiB1c2luZyBbSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5L2lkZW50aXR5LWRvY3VtZW50LXVwbG9hZC8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0JywgJ2lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldDogYXN5bmMgKGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlHZXQnLCAnaWRlbnRpdHlHZXRSZXF1ZXN0JywgaWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaDogYXN5bmMgKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlNYXRjaCcsICdpZGVudGl0eU1hdGNoUmVxdWVzdCcsIGlkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vYXV0b2ZpbGwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25HZXQnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeScsICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vcmV0cnlgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjaycsICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0OiBhc3luYyAoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXQnLCAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaDogYXN5bmMgKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zU2VhcmNoJywgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzQXV0aEdldCcsICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0OiBhc3luYyAoaXNzdWVzR2V0UmVxdWVzdDogSXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpc3N1ZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpc3N1ZXNHZXQnLCAnaXNzdWVzR2V0UmVxdWVzdCcsIGlzc3Vlc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lzc3Vlcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXNzdWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWFyY2ggZm9yIGFuIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogIGBpdGVtX2lkYCwgYGxpbmtfc2Vzc2lvbl9pZGAgb3IgTGluayBzZXNzaW9uIGByZXF1ZXN0X2lkYC4gIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1NlYXJjaDogYXN5bmMgKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXNzdWVzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXNzdWVzU2VhcmNoJywgJ2lzc3Vlc1NlYXJjaFJlcXVlc3QnLCBpc3N1ZXNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pc3N1ZXMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTdWJzY3JpYmU6IGFzeW5jIChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lzc3Vlc1N1YnNjcmliZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lzc3Vlc1N1YnNjcmliZScsICdpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0JywgaXNzdWVzU3Vic2NyaWJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXNzdWVzL3N1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQ3JlYXRlUHVibGljVG9rZW4nLCAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldDogYXN5bmMgKGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUdldCcsICdpdGVtR2V0UmVxdWVzdCcsIGl0ZW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydDogYXN5bmMgKGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtSW1wb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUltcG9ydCcsICdpdGVtSW1wb3J0UmVxdWVzdCcsIGl0ZW1JbXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2ltcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtSW1wb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZTogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UnLCAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgQ2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyBhIHJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2Ugd2hlbiBvZmZib2FyZGluZyB1c2VycyBvciBpZiBhIHVzZXIgY2hvb3NlcyB0byBkaXNjb25uZWN0IGFuIGFjY291bnQgbGlua2VkIHZpYSBQbGFpZC4gRm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cywgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIExpYWJpbGl0aWVzLCBhbmQgSW52ZXN0bWVudHMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgcmVxdWlyZWQgdG8gZW5kIHN1YnNjcmlwdGlvbiBiaWxsaW5nIGZvciB0aGUgSXRlbS4gRm9yIG1vbmV5IG1vdmVtZW50IHByb2R1Y3RzIHN1Y2ggYXMgQXV0aCBhbmQgVHJhbnNmZXIsIGlmIHRoZSBJdGVtIGlzIGF0IGFuIGluc3RpdHV0aW9uIHRoYXQgdXNlcyBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChUQU5zKSwgc3VjaCBhcyBDaGFzZSBvciBQTkMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgd2lsbCBpbnZhbGlkYXRlIHRoZSBUQU4sIGFuZCBzdWJzZXF1ZW50IEFDSCB0cmFuc2ZlciBhdHRlbXB0cyB1c2luZyB0aGF0IFRBTiB3aWxsIGJlIHJldHVybmVkLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGRvZXMgbm90IGltcGFjdCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBMaW1pdGVkIFByb2R1Y3Rpb24gSXRlbXMgeW91IGhhdmUgYXZhaWxhYmxlLiAgUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIGFjY2VzcyB0byB0aGVtIHNwZWNpZmljYWxseSB1c2luZyB0aGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmU6IGFzeW5jIChpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1SZW1vdmUnLCAnaXRlbVJlbW92ZVJlcXVlc3QnLCBpdGVtUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlOiBhc3luYyAoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtV2ViaG9va1VwZGF0ZScsICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0OiBhc3luYyAobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaWFiaWxpdGllc0dldCcsICdsaWFiaWxpdGllc0dldFJlcXVlc3QnLCBsaWFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaWFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGU6IGFzeW5jIChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUNyZWF0ZScsICdsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0OiBhc3luYyAobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rRGVsaXZlcnlHZXQnLCAnbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCcsIGxpbmtEZWxpdmVyeUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmtfZGVsaXZlcnkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZTogYXN5bmMgKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlJywgJ2xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QnLCBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldDogYXN5bmMgKGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuR2V0JywgJ2xpbmtUb2tlbkdldFJlcXVlc3QnLCBsaW5rVG9rZW5HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBmcm9tIGEgbGlzdCBvZiBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgaW5zaWdodHMgZm9yIHRoZSBwcm92aWRlZCBgYWNjZXNzX3Rva2Vuc2BcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0OiBhc3luYyAobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdDogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCduZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQnLCAnbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCcsIG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL25ldHdvcmtfaW5zaWdodHMvcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldDogYXN5bmMgKG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbmV0d29ya1N0YXR1c0dldCcsICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcsIG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9uZXR3b3JrL3N0YXR1cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckNyZWF0ZScsICdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyUmVtb3ZlOiBhc3luYyAocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUnLCAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlJywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KSwgYW5kIHN0YW5kaW5nIG9yZGVycywgdmFyaWFibGUgcmVjdXJyaW5nIHBheW1lbnRzLCBhbmQgVmlydHVhbCBBY2NvdW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgIHRoZSBsaWtlbGlob29kIG9mIHJlZnVuZCBiZWluZyBzdWNjZXNzZnVsIHdpdGhvdXQgaHVtYW4gaW50ZXJ2ZW50aW9uLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVDcmVhdGU6IGFzeW5jIChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlQ3JlYXRlJywgJ3BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlR2V0OiBhc3luYyAocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUdldCcsICdwYXltZW50UHJvZmlsZUdldFJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZVJlbW92ZTogYXN5bmMgKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVSZW1vdmUnLCAncGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQWNjb3VudEdldDogYXN5bmMgKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQWNjb3VudEdldCcsICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcsIHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcsIHNhdmluZ3MsIG9yIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBdXRoR2V0OiBhc3luYyAocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JBdXRoR2V0JywgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYWxhbmNlR2V0OiBhc3luYyAocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYWxhbmNlR2V0JywgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUnLCAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0OiBhc3luYyAocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJZGVudGl0eUdldCcsICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldDogYXN5bmMgKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcsIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldDogYXN5bmMgKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQnLCAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0JywgJ3Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIFRvIHJldm9rZSBhIGJhbmsgYWNjb3VudCB0b2tlbiwgdGhlIGVudGlyZSB1bmRlcmx5aW5nIGFjY2VzcyB0b2tlbiBtdXN0IGJlIHJldm9rZWQgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gSWYgdXNpbmcgbXVsdGlwbGUgcHJvY2Vzc29ycywgbXVsdGlwbGUgZGlmZmVyZW50IHByb2Nlc3NvciB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIGFjY2VzcyB0b2tlbi4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9maWxlTmV0d29ya1N0YXR1c0dldDogYXN5bmMgKHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQnLCAncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0JywgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBjYXNoZmxvdyB1cGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2hmbG93IFVwZGF0ZXNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlOiBhc3luYyAoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlJywgJ3NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0Jywgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEluY29tZUZpcmVXZWJob29rJywgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gc2FtZSBkYXkgbWljcm8tZGVwb3NpdCBpdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBDaGFzZSBhbmQgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1GaXJlV2ViaG9vaycsICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luOiBhc3luYyAoc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVJlc2V0TG9naW4nLCAnc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1czogYXN5bmMgKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMnLCAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0Jywgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHM6IGFzeW5jIChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzJywgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcsIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9vYXV0aC9zZWxlY3RfYWNjb3VudHNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luJywgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIHZhcmlvdXMgcGF5bWVudCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFRoaXMgZW5kcG9pbnQgd2lsbCB0cmlnZ2VyIHRoZSBjb3JyZXNwb25kaW5nIHBheW1lbnQgc3RhdHVzIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcGF5bWVudCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFBheW1lbnRTaW11bGF0ZScsICdzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQ6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Q6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3QnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW4vYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFVzZXJSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VXNlclJlc2V0TG9naW4nLCAnc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRGVjaXNpb25SZXBvcnQnLCAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZTogYXN5bmMgKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbEV2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRXZhbHVhdGUnLCAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0Jywgc2lnbmFsRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIFNpZ25hbCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBTaWduYWwgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFNjaGVkdWxlUmVxdWVzdH0gc2lnbmFsU2NoZWR1bGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsU2NoZWR1bGU6IGFzeW5jIChzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzaWduYWxTY2hlZHVsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFNjaGVkdWxlJywgJ3NpZ25hbFNjaGVkdWxlUmVxdWVzdCcsIHNpZ25hbFNjaGVkdWxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3NjaGVkdWxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNEb3dubG9hZDogYXN5bmMgKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0Rvd25sb2FkJywgJ3N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QnLCBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdDogYXN5bmMgKHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0xpc3QnLCAnc3RhdGVtZW50c0xpc3RSZXF1ZXN0Jywgc3RhdGVtZW50c0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzUmVmcmVzaDogYXN5bmMgKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c1JlZnJlc2gnLCAnc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0Jywgc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2U6IGFzeW5jICh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VuaGFuY2UnLCAndHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VucmljaDogYXN5bmMgKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zRW5yaWNoJywgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvZW5yaWNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgIFdoZW4gdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgZm9yIGJlc3QgcmVzdWx0cywgbWFrZSBzdXJlIHRvIHVzZSB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBwYXJhbWV0ZXIgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIEl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0JywgJ3RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoOiBhc3luYyAodHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWZyZXNoJywgJ3RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZTogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUnLCAndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNMaXN0OiBhc3luYyAodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSdWxlc0xpc3QnLCAndHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZTogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUnLCAndHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jOiBhc3luYyAodHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNTeW5jJywgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JywgdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCcsICd0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWw6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCcsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGU6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZScsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJCYWxhbmNlR2V0JywgJ3RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnLCB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhbmNlbDogYXN5bmMgKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDYW5jZWwnLCAndHJhbnNmZXJDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQ6IGFzeW5jICh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0JywgJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCcsIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQ6IGFzeW5jICh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldCcsICd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0JywgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNyZWF0ZScsICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQ6IGFzeW5jICh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQnLCAndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QnLCB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQ6IGFzeW5jICh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0JywgJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCcsIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJFdmVudExpc3QnLCAndHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jICh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRTeW5jJywgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvc3luY2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYC4gT25lIG9mIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgIG11c3QgYmUgcG9wdWxhdGVkIGJ1dCBub3QgYm90aC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudENyZWF0ZScsICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0fSB0cmFuc2ZlckludGVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudEdldDogYXN5bmMgKHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdDogVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVySW50ZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJJbnRlbnRHZXQnLCAndHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0JywgdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9pbnRlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlcG9zaXQgZnVuZHMgaW50byBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdDogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJEZXBvc2l0JywgJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9yc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGU6IGFzeW5jICh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZScsICd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckdldDogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJHZXQnLCAndHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXc6IGFzeW5jICh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXcnLCAndHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QnLCB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGlzdDogYXN5bmMgKHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMaXN0JywgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnLCB0cmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWV0cmljc0dldDogYXN5bmMgKHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJNZXRyaWNzR2V0JywgJ3RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QnLCB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9tZXRyaWNzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yR2V0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3Q6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3QnLCAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCBhbGxvd3MgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHNwZWNpZmljIHRvIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIGxlZ2FsIHRlcm1zIHJlcXVpcmVkIGJlZm9yZSBhY2NlcHRpbmcgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIG9yaWdpbmF0b3IgZm9yIHNjYWxlZCBwbGF0Zm9ybSBjdXN0b21lcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZScsICd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZScsICd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGAgZW5kcG9pbnQgYWxsb3dzIHBsYXRmb3JtcyB0byBzdWJtaXQgb25ib2FyZGluZyByZXF1aXJlbWVudHMgZm9yIGFuIG9yaWdpbmF0b3IgYXMgcGFydCBvZiB0aGUgU2NhbGVkIFBsYXRmb3JtIFRyYW5zZmVyIG9mZmVyaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgb25ib2FyZGluZyByZXF1aXJlbWVudHMgZm9yIFNjYWxlZCBQbGF0Zm9ybSBvcmlnaW5hdG9yc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQ6IGFzeW5jICh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCcsICd0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0JywgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlJywgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwnLCAndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQ6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nR2V0JywgJ3RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdMaXN0JywgJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsJywgJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENyZWF0ZScsICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0OiBhc3luYyAodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZEdldCcsICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3Q6IGFzeW5jICh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVwYXltZW50TGlzdCcsICd0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcEdldDogYXN5bmMgKHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJTd2VlcEdldCcsICd0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwTGlzdDogYXN5bmMgKHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJTd2VlcExpc3QnLCAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHVzZXIgcGVybWlzc2lvbmVkIGFjY291bnQgZGF0YSBpbmNsdWRpbmcgaWRlbnRpdHkgYW5kIEl0ZW0gYWNjZXNzIHRva2Vucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBY2NvdW50U2Vzc2lvbkdldDogYXN5bmMgKHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckFjY291bnRTZXNzaW9uR2V0JywgJ3VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QnLCB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyX2FjY291bnQvc2Vzc2lvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBDaGVjayBvciBJbmNvbWUgZmxvdywgb3IgYSBNdWx0aS1JdGVtIExpbmsgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgVGhlIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IG11c3QgYmUgcHJlc2VudCBpbiBvcmRlciB0byBjcmVhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQgZm9yIGEgdXNlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkIGR1cmluZyB0aGUgYC91c2VyL2NyZWF0ZWAgY2FsbCwgaXQgY2FuIGJlIGFkZGVkIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNyZWF0ZTogYXN5bmMgKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckNyZWF0ZScsICd1c2VyQ3JlYXRlUmVxdWVzdCcsIHVzZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXIgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VySXRlbXNHZXQ6IGFzeW5jICh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJJdGVtc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJJdGVtc0dldCcsICd1c2VySXRlbXNHZXRSZXF1ZXN0JywgdXNlckl0ZW1zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9pdGVtcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckl0ZW1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgdXNlciB0b2tlbiBhbmQgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbi4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdXNlciBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUmVtb3ZlUmVxdWVzdH0gdXNlclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyUmVtb3ZlOiBhc3luYyAodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyUmVtb3ZlJywgJ3VzZXJSZW1vdmVSZXF1ZXN0JywgdXNlclJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZTogYXN5bmMgKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZScsICd1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCcsIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlOiBhc3luYyAodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlJywgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JywgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAgZm9yIHVzZSB3aXRoIENvbnN1bWVyIFJlcG9ydHMgYnkgUGxhaWQgQ2hlY2ssIGJ5IGFkZGluZyBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IHRvIHRoZSB1c2VyLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlOiBhc3luYyAodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVXBkYXRlJywgJ3VzZXJVcGRhdGVSZXF1ZXN0JywgdXNlclVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZTogYXN5bmMgKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0Q3JlYXRlJywgJ3dhbGxldENyZWF0ZVJlcXVlc3QnLCB3YWxsZXRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQ6IGFzeW5jICh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldEdldCcsICd3YWxsZXRHZXRSZXF1ZXN0Jywgd2FsbGV0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0TGlzdDogYXN5bmMgKHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0TGlzdCcsICd3YWxsZXRMaXN0UmVxdWVzdCcsIHdhbGxldExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlOiBhc3luYyAod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUnLCAnd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQ6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uR2V0JywgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Q6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uTGlzdCcsICd3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGl0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcHJvZ3JhbS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQ6IGFzeW5jICh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQnLCAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnLCB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUZwID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yID0gUGxhaWRBcGlBeGlvc1BhcmFtQ3JlYXRvcihjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYWxsIEFjY291bnRzIGxpbmtlZCB0byB0aGlzIEJlYWNvbiBVc2VyLiBUaGUgaW5zaWdodHMgZm9yIGVhY2ggYWNjb3VudCBhcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdH0gYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBCZWFjb24gVXNlciBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc2VudEV2ZW50c0dldFJlcXVlc3R9IGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q29uc2VudEV2ZW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAgY3JlYXRlcyBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0fSBjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Q6IENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFCYW5rSW5jb21lQ3JlYXRlKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2Nhc2hmbG93X2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgY3JlYXRlcyBhIENvbnN1bWVyIFJlcG9ydCBwb3dlcmVkIGJ5IFBsYWlkIENoZWNrLiBZb3UgY2FuIGNhbGwgdGhpcyBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcmVwb3J0IGlmIGBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZWAgd2FzIG9taXR0ZWQgZHVyaW5nIExpbmsgdG9rZW4gY3JlYXRpb24uIElmIHlvdSBkaWQgcHJvdmlkZSBhIGBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZWAgZHVyaW5nIExpbmsgdG9rZW4gY3JlYXRpb24sIHRoZW4gUGxhaWQgQ2hlY2sgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGNyZWF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0IG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBMaW5rIHByb2Nlc3MsIGFuZCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYmVmb3JlIHJldHJpZXZpbmcgdGhlIHJlcG9ydC4gICBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlZnJlc2ggZGF0YSBpbiBhbiBleGlzdGluZyByZXBvcnQuIEEgQ29uc3VtZXIgUmVwb3J0IHdpbGwgbGFzdCBmb3IgMjQgaG91cnMgYmVmb3JlIGV4cGlyaW5nOyB5b3Ugc2hvdWxkIGNhbGwgYW55IGAvZ2V0YCBlbmRwb2ludHMgb24gdGhlIHJlcG9ydCBiZWZvcmUgaXQgZXhwaXJlcy4gSWYgYSByZXBvcnQgZXhwaXJlcywgeW91IGNhbiBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGFnYWluIHRvIHJlLWdlbmVyYXRlIGl0LiBOb3RlIHRoYXQgcmVmcmVzaGluZyBvciByZWdlbmVyYXRpbmcgYSByZXBvcnQgaXMgYSBiaWxsYWJsZSBldmVudC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQ29uc3VtZXIgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydENyZWF0ZShjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBwcm9kdWN0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19hdHRyaWJ1dGVzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGVzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBhdHRyaWJ1dGVzIGZvciB0aGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBDb25zdW1lciBSZXBvcnRzIGFzIGEgUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYCByZWdpc3RlcnMgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3JlZ2lzdGVyYCByZWdpc3RlcnMgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbG9hbiBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIHJlcG9ydCBieSBwYXNzaW5nIGluIHRoZSBgdXNlcl90b2tlbmAgcmVmZXJyZWQgdG8gaW4gdGhlIHdlYmhvb2sgeW91IHJlY2VpdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBsaW5rZWQgQ1JBIGl0ZW1zLCB3aGljaCBhcmUgdXBkYXRlZCBldmVyeSBkYXkgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YCByZXR1cm5zIGNhc2ggZmxvdyBpbnNpZ2h0cyBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci4gSWYgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBpcyBubyBsb25nZXIgdmFsaWQgKGkuZS4gZGVsZXRlZCksIHRoZSBlbmRwb2ludCB3aWxsIHJlZnJlc2ggdGhlIG1vc3QgcmVjZW50IHZhbGlkIHJlcG9ydCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiB1c2UgdXNlZCB0byBhdWRpdCBvciB0cmFjayB0aGUgbGlzdCBvZiByZXZpZXdlcnMgZm9yIE1vbml0b3IsIEJlYWNvbiwgYW5kIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkLCBvQVVUSFNUQVRFSUQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBSZWNpcGllbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmdldFJlY2lwaWVudHMob3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdXBsb2FkZWQgZG9jdW1lbnQgaWRlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnQgaG9sZGluZ3MgYW5kIHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGBJc3N1ZWAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIHNpbmdsZSBgSXNzdWVgIG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzR2V0UmVxdWVzdH0gaXNzdWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0OiBJc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElzc3Vlc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGZvciBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJc3N1ZXNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBhIHVzZXIgdG8gc3Vic2NyaWJlIHRvIHVwZGF0ZXMgb24gYSBzcGVjaWZpYyBgSXNzdWVgIHVzaW5nIGEgUE9TVCBtZXRob2QuIFN1YnNjcmliZXJzIHdpbGwgcmVjZWl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB3aGVuIHJlc29sdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXNzdWVzU3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLiBGb3IgbW9uZXkgbW92ZW1lbnQgcHJvZHVjdHMgc3VjaCBhcyBBdXRoIGFuZCBUcmFuc2ZlciwgaWYgdGhlIEl0ZW0gaXMgYXQgYW4gaW5zdGl0dXRpb24gdGhhdCB1c2VzIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKFRBTnMpLCBzdWNoIGFzIENoYXNlIG9yIFBOQywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCB3aWxsIGludmFsaWRhdGUgdGhlIFRBTiwgYW5kIHN1YnNlcXVlbnQgQUNIIHRyYW5zZmVyIGF0dGVtcHRzIHVzaW5nIHRoYXQgVEFOIHdpbGwgYmUgcmV0dXJuZWQuICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgZG9lcyBub3QgaW1wYWN0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIExpbWl0ZWQgUHJvZHVjdGlvbiBJdGVtcyB5b3UgaGF2ZSBhdmFpbGFibGUuICBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgYWNjZXNzIHRvIHRoZW0gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAuIEZvciBtb3N0IFBsYWlkIHByb2R1Y3RzLCB0aGUgYHB1YmxpY190b2tlbmAgaXMgc2F2ZWQgYW5kIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBmcm9tIGEgbGlzdCBvZiBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgaW5zaWdodHMgZm9yIHRoZSBwcm92aWRlZCBgYWNjZXNzX3Rva2Vuc2BcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0KG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3Q6IE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubmV0d29ya0luc2lnaHRzUmVwb3J0R2V0KG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9uZXR3b3JrL3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgc3RyZWFtbGluZWQgZXhwZXJpZW5jZSwgc3VjaCBhcyBMYXllci4gIE5vdGU6IGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGNoZWNrIGZvciBMYXllciBlbGlnaWJpbGl0eSBpbiB0aGUgZnJvbnRlbmQuIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjaGVja2luZyBMYXllciBlbGlnaWJpbGl0eSBpZiBhIGZyb250ZW5kIGNoZWNrIGlzIG5vdCBwb3NzaWJsZSBmb3IgeW91ciB1c2UgY2FzZS4gRm9yIGluc3RydWN0aW9ucyBvbiBwZXJmb3JtaW5nIGEgZnJvbnRlbmQgZWxpZ2liaWxpdHkgY2hlY2ssIHNlZSB0aGUgW0xheWVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge05ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIG5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIGZ1bGwgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgcGF5bWVudCBjb25zZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSBwYXltZW50cyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFBheW1lbnQgY29uc2VudHMgYXJlIGNyZWF0ZWQgd2l0aCBgVU5BVVRIT1JJU0VEYCBzdGF0dXMgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBhdXRob3Jpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBwYXltZW50cyBjYW4gYmUgaW5pdGlhdGVkLiAgQ29uc2VudHMgY2FuIGJlIGxpbWl0ZWQgaW4gdGltZSBhbmQgc2NvcGUsIGFuZCBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgZGVzY3JpYmUgbGltaXRhdGlvbnMgZm9yIHBheW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLCBhbmQgc3RhbmRpbmcgb3JkZXJzLCB2YXJpYWJsZSByZWN1cnJpbmcgcGF5bWVudHMsIGFuZCBWaXJ0dWFsIEFjY291bnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSW52ZXN0bWVudCBIb2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIElmIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMsIG11bHRpcGxlIGRpZmZlcmVudCBwcm9jZXNzb3IgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIGZvciBhIHNpbmdsZSBhY2Nlc3MgdG9rZW4uIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gVG8gcmV2b2tlIHRoZSBwcm9jZXNzb3JcXCdzIGFjY2VzcywgdGhlIGVudGlyZSBJdGVtIG11c3QgYmUgZGVsZXRlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBjYXNoZmxvdyB1cGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2hmbG93IFVwZGF0ZXNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIHNhbWUgZGF5IG1pY3JvLWRlcG9zaXQgaXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25z4oCZIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgQ2hhc2UgYW5kIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgdmFyaW91cyBwYXltZW50IGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVGhpcyBlbmRwb2ludCB3aWxsIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgcGF5bWVudCBzdGF0dXMgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBwYXltZW50IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YSwgb3Igd2l0aCBQbGFpZFxcJ3MgW3ByZS1wb3B1bGF0ZWQgU2FuZGJveCB0ZXN0IGFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdGVzdC1jcmVkZW50aWFscy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW4vYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIFNpZ25hbCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBTaWduYWwgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL3NjaGVkdWxlYCB0byBzY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBTY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsU2NoZWR1bGVSZXF1ZXN0fSBzaWduYWxTY2hlZHVsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxTY2hlZHVsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRoZSBJdGVtIHdhcyBsYXN0IHVwZGF0ZWQsIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gICBXaGVuIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGZvciBiZXN0IHJlc3VsdHMsIG1ha2Ugc3VyZSB0byB1c2UgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgcGFyYW1ldGVyIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBJdGVtcyB3aXRoIFRyYW5zYWN0aW9ucy4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gVGhlIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gd2lsbCBleHBpcmUgaWYgbm90IHVzZWQgYWZ0ZXIgb25lIGhvdXIuIChZb3UgY2FuIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1dGhvcml6YXRpb24gbGlmZXRpbWUuKSAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgaXMgbmVlZGVkLCB1c3VhbGx5IHRvIGZpeCBhIGJyb2tlbiBiYW5rIGNvbm5lY3Rpb24sIGJlZm9yZSBQbGFpZCBjYW4gcHJvcGVybHkgYXNzZXNzIHRoZSByaXNrLiBZb3UgbmVlZCB0byBsYXVuY2ggTGluayBpbiB1cGRhdGUgbW9kZSB0byBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgdXNlciBhY3Rpb24uIFdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCB0byBnZXQgYSBuZXcgTGluayB0b2tlbiwgaW5zdGVhZCBvZiBwcm92aWRpbmcgYGFjY2Vzc190b2tlbmAgaW4gdGhlIHJlcXVlc3QsIHlvdSBzaG91bGQgc2V0IFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgYXMgdGhlIGBhdXRob3JpemF0aW9uLmlkYC4gQWZ0ZXIgdGhlIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbi4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGdldCBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIG9mIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0fSB0cmFuc2ZlckludGVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3Q6IFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IGFsbG93cyBnYXRoZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3Igc3BlY2lmaWMgdG8gdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZywgaW5jbHVkaW5nIHRoZSBvcmlnaW5hdG9yXFwncyBhZ3JlZW1lbnQgdG8gbGVnYWwgdGVybXMgcmVxdWlyZWQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gb3JpZ2luYXRvciBmb3Igc2NhbGVkIHBsYXRmb3JtIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IGFsbG93cyBwbGF0Zm9ybXMgdG8gc3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBhbiBvcmlnaW5hdG9yIGFzIHBhcnQgb2YgdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBTY2FsZWQgUGxhdGZvcm0gb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFVzZXIgQWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3R9IHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIENoZWNrIG9yIEluY29tZSBmbG93LCBvciBhIE11bHRpLUl0ZW0gTGluayBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBUaGUgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJJdGVtc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL3JlbW92ZWAgZGVsZXRlcyBhIHVzZXIgdG9rZW4gYW5kIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9rZW4uICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHVzZXIgZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBlbmFibGUgYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gIGZvciB1c2Ugd2l0aCBDb25zdW1lciBSZXBvcnRzIGJ5IFBsYWlkIENoZWNrLCBieSBhZGRpbmcgYSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCB0byB0aGUgdXNlci4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFBsYWlkQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gVG8gcmV0dXJuIG5ldyBhY2NvdW50cyB0aGF0IHdlcmUgY3JlYXRlZCBhZnRlciB0aGUgdXNlciBsaW5rZWQgdGhlaXIgSXRlbSwgeW91IGNhbiBsaXN0ZW4gZm9yIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcsIHNhdmluZ3MsIGFuZCBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBdXRoR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgUGxhaWQtaW5pdGlhdGVkIEFDSCBvciBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdH0gYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIGZyYXVkIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3R9IGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdDogQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0fSBiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3Q6IEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDb25zZW50RXZlbnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9jcmVhdGVgIGNyZWF0ZXMgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdH0gY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lQ3JlYXRlKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0OiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cywgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9jYXNoZmxvd19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgaW5zaWdodHMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHBhcmFtZXRlcnMgdW5kZXIgYG9wdGlvbnNgIHRvIGNvbmZpZ3VyZSB3aGljaCBpbnNpZ2h0cyB5b3Ugd2FudCB0byByZWNlaXZlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcHJvZHVjdCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCB0aGUgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX25ldHdvcmtfYXR0cmlidXRlc2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgYXR0cmlidXRlcyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgY2FsbCBvdXIgcGFydG5lcnMgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBDb25zdW1lciBSZXBvcnRzIGFzIGEgUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHMuXG4gICAgICAgICAqIEBwYXJhbSB7Q1JBTG9hbnNSZWdpc3RlclJlcXVlc3R9IGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdDogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUxvYW5zVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBsaW5rZWQgQ1JBIGl0ZW1zLCB3aGljaCBhcmUgdXBkYXRlZCBldmVyeSBkYXkgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlIGZyb20gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIHRoZSBlbXBsb3ltZW50IHJlcG9ydChzKSBkZXJpdmVkIGZyb20gYmFuayB0cmFuc2FjdGlvbiBkYXRhIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuIElmIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpLmUuIGRlbGV0ZWQpLCB0aGUgZW5kcG9pbnQgd2lsbCByZWZyZXNoIHRoZSBtb3N0IHJlY2VudCB2YWxpZCByZXBvcnQgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYHJpc2tfc2lnbmFsc2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBmcmF1ZCBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBtYW51YWxseSB1cGxvYWRlZCBkb2N1bWVudChzKS5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmdldFJlY2lwaWVudChyZWNpcGllbnRJZCwgb0FVVEhTVEFURUlELCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50cyhvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEdldFJlY2lwaWVudHNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZ2V0UmVjaXBpZW50cyhvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdDogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlSZWZyZXNoUmVxdWVzdH0gaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGJ5IHRoZSBgY2xpZW50X3VzZXJfaWRgIGZpZWxkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiB5b3UgZG9uXFwndCBrbm93IHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgdXNlciBhbHJlYWR5IGhhcyBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB5b3UgY2FuIHNwZWNpZnkgYFxcXCJpc19pZGVtcG90ZW50XFxcIjogdHJ1ZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gV2l0aCBpZGVtcG90ZW5jeSBlbmFibGVkLCBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bm1vZGlmaWVkIHdpdGggYW4gYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBlbmRwb2ludCB0byBzdXBwbHkgaW5mb3JtYXRpb24geW91IGFscmVhZHkgaGF2ZSBjb2xsZWN0ZWQgYWJvdXQgdGhlIHVzZXI7IGlmIGFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhlIHNjcmVlbnMgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZW0gd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgTGluayBmbG93LiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnQgaG9sZGluZ3MgYW5kIHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGZvciBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJc3N1ZXNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgYSB1c2VyIHRvIHN1YnNjcmliZSB0byB1cGRhdGVzIG9uIGEgc3BlY2lmaWMgYElzc3VlYCB1c2luZyBhIFBPU1QgbWV0aG9kLiBTdWJzY3JpYmVycyB3aWxsIHJlY2VpdmUgd2ViaG9vayBub3RpZmljYXRpb25zIHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgd2hlbiByZXNvbHZlZC5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU3Vic2NyaWJlUmVxdWVzdH0gaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1N1YnNjcmliZShpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0uIEZvciBtb25leSBtb3ZlbWVudCBwcm9kdWN0cyBzdWNoIGFzIEF1dGggYW5kIFRyYW5zZmVyLCBpZiB0aGUgSXRlbSBpcyBhdCBhbiBpbnN0aXR1dGlvbiB0aGF0IHVzZXMgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoVEFOcyksIHN1Y2ggYXMgQ2hhc2Ugb3IgUE5DLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIHdpbGwgaW52YWxpZGF0ZSB0aGUgVEFOLCBhbmQgc3Vic2VxdWVudCBBQ0ggdHJhbnNmZXIgYXR0ZW1wdHMgdXNpbmcgdGhhdCBUQU4gd2lsbCBiZSByZXR1cm5lZC4gIEluIExpbWl0ZWQgUHJvZHVjdGlvbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgTGltaXRlZCBQcm9kdWN0aW9uIEl0ZW1zIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYC4gRm9yIG1vc3QgUGxhaWQgcHJvZHVjdHMsIHRoZSBgcHVibGljX3Rva2VuYCBpcyBzYXZlZCBhbmQgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgZnJvbSBhIGxpc3Qgb2YgYGFjY2Vzc190b2tlbnNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGluc2lnaHRzIGZvciB0aGUgcHJvdmlkZWQgYGFjY2Vzc190b2tlbnNgXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdH0gbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0OiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLCBhbmQgc3RhbmRpbmcgb3JkZXJzLCB2YXJpYWJsZSByZWN1cnJpbmcgcGF5bWVudHMsIGFuZCBWaXJ0dWFsIEFjY291bnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIFRvIHJldm9rZSB0aGUgcHJvY2Vzc29yXFwncyBhY2Nlc3MsIHRoZSBlbnRpcmUgSXRlbSBtdXN0IGJlIGRlbGV0ZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIHVwZGF0ZSBmb3IgY2FzaGZsb3cgdXBkYXRlcyAoTW9uaXRvcmluZykgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoZmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdDogU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIHNhbWUgZGF5IG1pY3JvLWRlcG9zaXQgaXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25z4oCZIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgQ2hhc2UgYW5kIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgaXRlbShzKSBmb3IgYSBTYW5kYm94IFVzZXIgaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb24gSXRlbXMgd2hlcmUgU2lnbmFsIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFNpZ25hbCB3aWxsIGhhdmUgYWNjZXNzIHRvIGxlc3MgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBTaWduYWwgc2NvcmUuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFNjaGVkdWxlUmVxdWVzdH0gc2lnbmFsU2NoZWR1bGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0OiBTaWduYWxTY2hlZHVsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsU2NoZWR1bGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgIFdoZW4gdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgZm9yIGJlc3QgcmVzdWx0cywgbWFrZSBzdXJlIHRvIHVzZSB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBwYXJhbWV0ZXIgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIEl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuIFRoZSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIHdpbGwgZXhwaXJlIGlmIG5vdCB1c2VkIGFmdGVyIG9uZSBob3VyLiAoWW91IGNhbiBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhdXRob3JpemF0aW9uIGxpZmV0aW1lLikgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgYWRkaXRpb25hbCB1c2VyIGlucHV0IGlzIG5lZWRlZCwgdXN1YWxseSB0byBmaXggYSBicm9rZW4gYmFuayBjb25uZWN0aW9uLCBiZWZvcmUgUGxhaWQgY2FuIHByb3Blcmx5IGFzc2VzcyB0aGUgcmlzay4gWW91IG5lZWQgdG8gbGF1bmNoIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgdG8gZ2V0IGEgbmV3IExpbmsgdG9rZW4sIGluc3RlYWQgb2YgcHJvdmlkaW5nIGBhY2Nlc3NfdG9rZW5gIGluIHRoZSByZXF1ZXN0LCB5b3Ugc2hvdWxkIHNldCBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGFzIHRoZSBgYXV0aG9yaXphdGlvbi5pZGAuIEFmdGVyIHRoZSBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24uICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuICAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIChEZXByZWNhdGVkKSBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYC4gT25lIG9mIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgIG11c3QgYmUgcG9wdWxhdGVkIGJ1dCBub3QgYm90aC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuIFRoaXMgZW5kcG9pbnQgaXMgYWxzbyByZXF1aXJlZCB3aGVuIGFkZGluZyBhbiBJdGVtIGZvciB1c2Ugd2l0aCB3aXJlIHRyYW5zZmVyczsgaWYgeW91IGludGVuZCB0byBjcmVhdGUgd2lyZSB0cmFuc2ZlcnMgb24gdGhpcyBhY2NvdW50LCB5b3UgbXVzdCBwcm92aWRlIGB3aXJlX3JvdXRpbmdfbnVtYmVyYC4gTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCBhbGxvd3MgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHNwZWNpZmljIHRvIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIGxlZ2FsIHRlcm1zIHJlcXVpcmVkIGJlZm9yZSBhY2NlcHRpbmcgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIG9yaWdpbmF0b3IgZm9yIHNjYWxlZCBwbGF0Zm9ybSBjdXN0b21lcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwZXJzb24gcmVjb3JkIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb24tc3BlY2lmaWMgcmVxdWlyZW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IGFsbG93cyBwbGF0Zm9ybXMgdG8gc3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBhbiBvcmlnaW5hdG9yIGFzIHBhcnQgb2YgdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBTY2FsZWQgUGxhdGZvcm0gb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgQ2hlY2sgb3IgSW5jb21lIGZsb3csIG9yIGEgTXVsdGktSXRlbSBMaW5rIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIFRoZSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCBtdXN0IGJlIHByZXNlbnQgaW4gb3JkZXIgdG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJJdGVtc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSB1c2VyIHRva2VuIGFuZCBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFueSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuLiAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB1c2VyIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJSZW1vdmVSZXF1ZXN0fSB1c2VyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5hYmxlIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYCBmb3IgdXNlIHdpdGggQ29uc3VtZXIgUmVwb3J0cyBieSBQbGFpZCBDaGVjaywgYnkgYWRkaW5nIGEgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgdG8gdGhlIHVzZXIuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUGxhaWRBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgUGxhaWRBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdH0gYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0gb3IgYWRkIG5ldyBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIuICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYW4gaWRlbnRpdHkgZGF0YSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0fSBjb25zZW50RXZlbnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3Q6IENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBleGlzdGluZyBDUkIgQmFuayBJbmNvbWUgYW5kIEJhc2UgcmVwb3J0cyBmb3IgdGhlIGNvbnN1bWVyIGluIFBERiBmb3JtYXQuICBSZXNwb25zZSBpcyBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Q6IENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYCBjcmVhdGVzIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0fSBjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Q6IENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQmFua0luY29tZUNyZWF0ZShjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQmFzZSBSZXBvcnQgZm9yIHlvdXIgdXNlciwgYWxsb3dpbmcgeW91IHRvIHJlY2VpdmUgY29tcHJlaGVuc2l2ZSBiYW5rIGFjY291bnQgYW5kIGNhc2ggZmxvdyBkYXRhLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2Nhc2hmbG93X2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20geW91ciB1c2VyXFwncyBiYW5raW5nIGRhdGFcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIENvbnN1bWVyIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydENyZWF0ZShjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBwcm9kdWN0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19hdHRyaWJ1dGVzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGVzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGF0dHJpYnV0ZXMgZm9yIHRoZSB1c2VyXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIENvbnN1bWVyIFJlcG9ydHMgYXMgYSBQREZcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMuXG4gICAgICogQHBhcmFtIHtDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlcyBsb2FuIGRhdGEuXG4gICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdDogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIHJlcG9ydCBieSBwYXNzaW5nIGluIHRoZSBgdXNlcl90b2tlbmAgcmVmZXJyZWQgdG8gaW4gdGhlIHdlYmhvb2sgeW91IHJlY2VpdmVkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgaXRlbXMsIHdoaWNoIGFyZSB1cGRhdGVkIGV2ZXJ5IGRheSAoYmVzdC1lZmZvcnQpLlxuICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAgcmV0dXJucyBjYXNoIGZsb3cgaW5zaWdodHMgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhUGFydG5lckluc2lnaHRzR2V0KGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuIElmIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpLmUuIGRlbGV0ZWQpLCB0aGUgZW5kcG9pbnQgd2lsbCByZWZyZXNoIHRoZSBtb3N0IHJlY2VudCB2YWxpZCByZXBvcnQgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYHJpc2tfc2lnbmFsc2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50XG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYCBlbmRwb2ludCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWZyZXNoIGEgcmVwb3J0IHRoYXQgd2FzIHJlbGF5ZWQgdG8gdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gQSBuZXcgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnQgcGFyYW1ldGVycywgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudElkIFJlY2lwaWVudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5nZXRSZWNpcGllbnQocmVjaXBpZW50SWQsIG9BVVRIU1RBVEVJRCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5nZXRSZWNpcGllbnRzKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvZiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudCBob2xkaW5ncyBhbmQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW2BJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYW5kIGhvbGRpbmdzIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIE5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBgSXNzdWVgLiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBzaW5nbGUgYElzc3VlYCBvYmplY3QuXG4gICAgICogQHN1bW1hcnkgR2V0IGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNHZXQoaXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTZWFyY2hSZXF1ZXN0fSBpc3N1ZXNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLiBGb3IgbW9uZXkgbW92ZW1lbnQgcHJvZHVjdHMgc3VjaCBhcyBBdXRoIGFuZCBUcmFuc2ZlciwgaWYgdGhlIEl0ZW0gaXMgYXQgYW4gaW5zdGl0dXRpb24gdGhhdCB1c2VzIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKFRBTnMpLCBzdWNoIGFzIENoYXNlIG9yIFBOQywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCB3aWxsIGludmFsaWRhdGUgdGhlIFRBTiwgYW5kIHN1YnNlcXVlbnQgQUNIIHRyYW5zZmVyIGF0dGVtcHRzIHVzaW5nIHRoYXQgVEFOIHdpbGwgYmUgcmV0dXJuZWQuICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgZG9lcyBub3QgaW1wYWN0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIExpbWl0ZWQgUHJvZHVjdGlvbiBJdGVtcyB5b3UgaGF2ZSBhdmFpbGFibGUuICBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgYWNjZXNzIHRvIHRoZW0gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5R2V0UmVxdWVzdH0gbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIGZyb20gYSBsaXN0IG9mIGBhY2Nlc3NfdG9rZW5zYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGluc2lnaHRzIGZvciB0aGUgcHJvdmlkZWQgYGFjY2Vzc190b2tlbnNgXG4gICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0KG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3Q6IE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5uZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIHN0cmVhbWxpbmVkIGV4cGVyaWVuY2UsIHN1Y2ggYXMgTGF5ZXIuICBOb3RlOiBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjaGVjayBmb3IgTGF5ZXIgZWxpZ2liaWxpdHkgaW4gdGhlIGZyb250ZW5kLiBgL25ldHdvcmsvc3RhdHVzL2dldGAgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY2hlY2tpbmcgTGF5ZXIgZWxpZ2liaWxpdHkgaWYgYSBmcm9udGVuZCBjaGVjayBpcyBub3QgcG9zc2libGUgZm9yIHlvdXIgdXNlIGNhc2UuIEZvciBpbnN0cnVjdGlvbnMgb24gcGVyZm9ybWluZyBhIGZyb250ZW5kIGVsaWdpYmlsaXR5IGNoZWNrLCBzZWUgdGhlIFtMYXllciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuXG4gICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy4gVG8gY3JlYXRlIGVuZCBjdXN0b21lcnMsIGl0IHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb25seSwgZXZlbiB3aGVuIGNyZWF0aW5nIFNhbmRib3ggQVBJIGtleXMuIElmIGNhbGxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgaXQgd2lsbCByZXR1cm4gYSBzYW1wbGUgcmVzcG9uc2UsIGJ1dCBubyBjdXN0b21lciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBBUEkga2V5cyB3aWxsIG5vdCBiZSB2YWxpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBmdWxsIFByb2R1Y3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KSwgYW5kIHN0YW5kaW5nIG9yZGVycywgdmFyaWFibGUgcmVjdXJyaW5nIHBheW1lbnRzLCBhbmQgVmlydHVhbCBBY2NvdW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZywgc2F2aW5ncywgb3IgY2FzaCBtYW5hZ2VtZW50IGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIFRvIHJldm9rZSBhIGJhbmsgYWNjb3VudCB0b2tlbiwgdGhlIGVudGlyZSB1bmRlcmx5aW5nIGFjY2VzcyB0b2tlbiBtdXN0IGJlIHJldm9rZWQgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gSWYgdXNpbmcgbXVsdGlwbGUgcHJvY2Vzc29ycywgbXVsdGlwbGUgZGlmZmVyZW50IHByb2Nlc3NvciB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIGFjY2VzcyB0b2tlbi4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICogQHBhcmFtIHtQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0KHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBiYW5rIGluY29tZSB3ZWJob29rIGluIHNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIGNhc2hmbG93IHVwZGF0ZXMgKE1vbml0b3JpbmcpIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoZmxvdyBVcGRhdGVzXG4gICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gc2FtZSBkYXkgbWljcm8tZGVwb3NpdCBpdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBDaGFzZSBhbmQgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcGF5bWVudCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBpdGVtKHMpIGZvciBhIFNhbmRib3ggVXNlciBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGFuIEl0ZW0gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcywgZGV2ZWxvcGluZyBhIFNpZ25hbCBzY29yZS4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbiBJdGVtcyB3aGVyZSBTaWduYWwgd2FzIGFkZGVkIGluIHRoZSBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IGJ1dCBub3QgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgIGFycmF5LiBJZiBgL3NpZ25hbC9wcmVwYXJlYCBpcyBza2lwcGVkIG9uIGFuIEl0ZW0gdGhhdCBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoZSBpbml0aWFsIGNhbGwgdG8gYC9zaWduYWwvZXZhbHVhdGVgIG9uIHRoYXQgSXRlbSB3aWxsIGJlIGxlc3MgYWNjdXJhdGUsIGJlY2F1c2UgU2lnbmFsIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gbGVzcyBkYXRhIGZvciBjb21wdXRpbmcgdGhlIFNpZ25hbCBzY29yZS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBTY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxTY2hlZHVsZVJlcXVlc3R9IHNpZ25hbFNjaGVkdWxlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdDogU2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IGlzIHJldHJ5YWJsZSBhbmQgaWRlbXBvdGVudDsgaWYgYSB0cmFuc2ZlciB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHRyYW5zZmVyIGRldGFpbHMgd2l0aG91dCBjcmVhdGluZyBhIG5ldyB0cmFuc2Zlci4gQSB0cmFuc2ZlciBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpZiBhIDUwMCBlcnJvciBpcyByZXR1cm5lZDsgdG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8sIHVzZSBbVHJhbnNmZXIgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3JlY29uY2lsaW5nLXRyYW5zZmVycy8pLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IGFsbG93cyBnYXRoZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3Igc3BlY2lmaWMgdG8gdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZywgaW5jbHVkaW5nIHRoZSBvcmlnaW5hdG9yXFwncyBhZ3JlZW1lbnQgdG8gbGVnYWwgdGVybXMgcmVxdWlyZWQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBzY2FsZWQgcGxhdGZvcm0gY3VzdG9tZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCBhbGxvd3MgcGxhdGZvcm1zIHRvIHN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgYW4gb3JpZ2luYXRvciBhcyBwYXJ0IG9mIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcuXG4gICAgICogQHN1bW1hcnkgU3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBTY2FsZWQgUGxhdGZvcm0gb3JpZ2luYXRvcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgQ2hlY2sgb3IgSW5jb21lIGZsb3csIG9yIGEgTXVsdGktSXRlbSBMaW5rIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIFRoZSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCBtdXN0IGJlIHByZXNlbnQgaW4gb3JkZXIgdG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICogQHN1bW1hcnkgR2V0IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgdXNlciB0b2tlbiBhbmQgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbi4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdXNlciBkb2VzIG5vdCBleGlzdC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyUmVtb3ZlKHVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBkZWxldGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBPbmNlIHJlbW92ZWQsIHRoZSB0b2tlbiBjYW4gbG9uZ2VyIGJlIHVzZWQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiAgIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAgZm9yIHVzZSB3aXRoIENvbnN1bWVyIFJlcG9ydHMgYnkgUGxhaWQgQ2hlY2ssIGJ5IGFkZGluZyBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IHRvIHRoZSB1c2VyLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdDogV2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxufVxuXG5cbiJdfQ== \ No newline at end of file diff --git a/dist/base.d.ts b/dist/base.d.ts index 7f1717c3..b253d24f 100644 --- a/dist/base.d.ts +++ b/dist/base.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/base.js b/dist/base.js index 9916c889..2da16876 100644 --- a/dist/base.js +++ b/dist/base.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -62,4 +62,4 @@ class RequiredError extends Error { } } exports.RequiredError = RequiredError; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjYxMC4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7Ozs7O0FBSUgseURBQXlEO0FBQ3pELGFBQWE7QUFDYixrREFBaUU7QUFFcEQsUUFBQSxTQUFTLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU1RTs7O0dBR0c7QUFDVSxRQUFBLGtCQUFrQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsSUFBSTtJQUNULEtBQUssRUFBRSxHQUFHO0NBQ2IsQ0FBQztBQVlGOzs7O0dBSUc7QUFDSCxNQUFhLE9BQU87SUFHaEIsWUFBWSxhQUE2QixFQUFZLFdBQW1CLGlCQUFTLEVBQVksUUFBdUIsZUFBVztRQUExRSxhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQTZCO1FBQzNILElBQUksYUFBYSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7QUFURCwwQkFTQztBQUFBLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQWEsYUFBYyxTQUFRLEtBQUs7SUFFcEMsWUFBbUIsS0FBYSxFQUFFLEdBQVk7UUFDMUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBREksVUFBSyxHQUFMLEtBQUssQ0FBUTtRQURoQyxTQUFJLEdBQW9CLGVBQWUsQ0FBQztJQUd4QyxDQUFDO0NBQ0o7QUFMRCxzQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjYxNy4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuLy8gU29tZSBpbXBvcnRzIG5vdCB1c2VkIGRlcGVuZGluZyBvbiB0ZW1wbGF0ZSBjb25kaXRpb25zXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgZ2xvYmFsQXhpb3MsIHsgQXhpb3NQcm9taXNlLCBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3QgQkFTRV9QQVRIID0gXCJodHRwczovL3Byb2R1Y3Rpb24ucGxhaWQuY29tXCIucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgQ09MTEVDVElPTl9GT1JNQVRTID0ge1xuICAgIGNzdjogXCIsXCIsXG4gICAgc3N2OiBcIiBcIixcbiAgICB0c3Y6IFwiXFx0XCIsXG4gICAgcGlwZXM6IFwifFwiLFxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZXF1ZXN0QXJnc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RBcmdzIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICBvcHRpb25zOiBhbnk7XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBCYXNlQVBJXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQVBJIHtcbiAgICBwcm90ZWN0ZWQgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBwcm90ZWN0ZWQgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCwgcHJvdGVjdGVkIGF4aW9zOiBBeGlvc0luc3RhbmNlID0gZ2xvYmFsQXhpb3MpIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFJlcXVpcmVkRXJyb3JcbiAqIEBleHRlbmRzIHtFcnJvcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgbmFtZTogXCJSZXF1aXJlZEVycm9yXCIgPSBcIlJlcXVpcmVkRXJyb3JcIjtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZmllbGQ6IHN0cmluZywgbXNnPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/common.d.ts b/dist/common.d.ts index 7a039371..2f1cda7f 100644 --- a/dist/common.d.ts +++ b/dist/common.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/common.js b/dist/common.js index 13f72898..086e9c36 100644 --- a/dist/common.js +++ b/dist/common.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -150,4 +150,4 @@ const createRequestFunction = function (axiosArgs, globalAxios, BASE_PATH, confi }; }; exports.createRequestFunction = createRequestFunction; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS42MTAuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7OztBQUlILGlDQUFvRDtBQUdwRDs7O0dBR0c7QUFDVSxRQUFBLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQTtBQUVuRDs7OztHQUlHO0FBQ0ksTUFBTSxpQkFBaUIsR0FBRyxVQUFVLFlBQW9CLEVBQUUsU0FBaUIsRUFBRSxVQUFtQjtJQUNuRyxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtRQUNqRCxNQUFNLElBQUksb0JBQWEsQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLFNBQVMsdUNBQXVDLFlBQVksR0FBRyxDQUFDLENBQUM7S0FDN0g7QUFDTCxDQUFDLENBQUE7QUFKWSxRQUFBLGlCQUFpQixxQkFJN0I7QUFFRDs7O0dBR0c7QUFDSSxNQUFNLGlCQUFpQixHQUFHLFVBQWdCLE1BQVcsRUFBRSxZQUFvQixFQUFFLGFBQTZCOztRQUM3RyxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxhQUFhLENBQUMsTUFBTSxLQUFLLFVBQVU7Z0JBQ2xFLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxtQkFBbUIsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FBQSxDQUFBO0FBUFksUUFBQSxpQkFBaUIscUJBTzdCO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxvQkFBb0IsR0FBRyxVQUFVLE1BQVcsRUFBRSxhQUE2QjtJQUNwRixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLElB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QUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQyxDQUFBO0FBUlksUUFBQSxxQkFBcUIseUJBUWpDO0FBRUQ7OztHQUdHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFRO0lBQzFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7QUFDL0MsQ0FBQyxDQUFBO0FBRlksUUFBQSxZQUFZLGdCQUV4QjtBQUVEOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsVUFBVSxTQUFzQixFQUFFLFdBQTBCLEVBQUUsU0FBaUIsRUFBRSxhQUE2QjtJQUMvSSxPQUFPLENBQUMsUUFBdUIsV0FBVyxFQUFFLFdBQW1CLFNBQVMsRUFBRSxFQUFFO1FBQ3hFLE1BQU0sZ0JBQWdCLG1DQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsUUFBUSxLQUFJLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEdBQUMsQ0FBQztRQUM1RyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUE7QUFMWSxRQUFBLHFCQUFxQix5QkFLakMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8qKlxuICogVGhlIFBsYWlkIEFQSVxuICogVGhlIFBsYWlkIFJFU1QgQVBJLiBQbGVhc2Ugc2VlIGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IDIwMjAtMDktMTRfMS42MTcuMVxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG5cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFJlcXVpcmVkRXJyb3Is44CAUmVxdWVzdEFyZ3MgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBBeGlvc0luc3RhbmNlIH0gZnJvbSAnYXhpb3MnO1xuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBEVU1NWV9CQVNFX1VSTCA9ICdodHRwczovL2V4YW1wbGUuY29tJ1xuXG4vKipcbiAqXG4gKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0UGFyYW1FeGlzdHMgPSBmdW5jdGlvbiAoZnVuY3Rpb25OYW1lOiBzdHJpbmcsIHBhcmFtTmFtZTogc3RyaW5nLCBwYXJhbVZhbHVlOiB1bmtub3duKSB7XG4gICAgaWYgKHBhcmFtVmFsdWUgPT09IG51bGwgfHwgcGFyYW1WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1aXJlZEVycm9yKHBhcmFtTmFtZSwgYFJlcXVpcmVkIHBhcmFtZXRlciAke3BhcmFtTmFtZX0gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyAke2Z1bmN0aW9uTmFtZX0uYCk7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRBcGlLZXlUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwga2V5UGFyYW1OYW1lOiBzdHJpbmcsIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgY29uZmlndXJhdGlvbi5hcGlLZXkpIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBcGlLZXlWYWx1ZSA9IHR5cGVvZiBjb25maWd1cmF0aW9uLmFwaUtleSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBjb25maWd1cmF0aW9uLmFwaUtleShrZXlQYXJhbU5hbWUpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYXBpS2V5O1xuICAgICAgICBvYmplY3Rba2V5UGFyYW1OYW1lXSA9IGxvY2FsVmFyQXBpS2V5VmFsdWU7XG4gICAgfVxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXRCYXNpY0F1dGhUb09iamVjdCA9IGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiAoY29uZmlndXJhdGlvbi51c2VybmFtZSB8fCBjb25maWd1cmF0aW9uLnBhc3N3b3JkKSkge1xuICAgICAgICBvYmplY3RbXCJhdXRoXCJdID0geyB1c2VybmFtZTogY29uZmlndXJhdGlvbi51c2VybmFtZSwgcGFzc3dvcmQ6IGNvbmZpZ3VyYXRpb24ucGFzc3dvcmQgfTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEJlYXJlckF1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiAmJiBjb25maWd1cmF0aW9uLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbigpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGFjY2Vzc1Rva2VuO1xuICAgIH1cbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2V0T0F1dGhUb09iamVjdCA9IGFzeW5jIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgbmFtZTogc3RyaW5nLCBzY29wZXM6IHN0cmluZ1tdLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbG9jYWxWYXJBY2Nlc3NUb2tlblZhbHVlID0gdHlwZW9mIGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gYXdhaXQgY29uZmlndXJhdGlvbi5hY2Nlc3NUb2tlbihuYW1lLCBzY29wZXMpXG4gICAgICAgICAgICA6IGF3YWl0IGNvbmZpZ3VyYXRpb24uYWNjZXNzVG9rZW47XG4gICAgICAgIG9iamVjdFtcIkF1dGhvcml6YXRpb25cIl0gPSBcIkJlYXJlciBcIiArIGxvY2FsVmFyQWNjZXNzVG9rZW5WYWx1ZTtcbiAgICB9XG59XG5cbi8qKlxuICpcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlYXJjaFBhcmFtcyA9IGZ1bmN0aW9uICh1cmw6IFVSTCwgLi4ub2JqZWN0czogYW55W10pIHtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgIGZvciAoY29uc3Qgb2JqZWN0IG9mIG9iamVjdHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQYXJhbXMuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdFtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhcmFtcy5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXJsLnNlYXJjaCA9IHNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVEYXRhSWZOZWVkZWQgPSBmdW5jdGlvbiAodmFsdWU6IGFueSwgcmVxdWVzdE9wdGlvbnM6IGFueSwgY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBub25TdHJpbmcgPSB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnO1xuICAgIGNvbnN0IG5lZWRzU2VyaWFsaXphdGlvbiA9IG5vblN0cmluZyAmJiBjb25maWd1cmF0aW9uICYmIGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZVxuICAgICAgICA/IGNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShyZXF1ZXN0T3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSlcbiAgICAgICAgOiBub25TdHJpbmc7XG4gICAgcmV0dXJuIG5lZWRzU2VyaWFsaXphdGlvblxuICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KVxuICAgICAgICA6ICh2YWx1ZSB8fCBcIlwiKTtcbn1cblxuLyoqXG4gKlxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgdG9QYXRoU3RyaW5nID0gZnVuY3Rpb24gKHVybDogVVJMKSB7XG4gICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2ggKyB1cmwuaGFzaFxufVxuXG4vKipcbiAqXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24gPSBmdW5jdGlvbiAoYXhpb3NBcmdzOiBSZXF1ZXN0QXJncywgZ2xvYmFsQXhpb3M6IEF4aW9zSW5zdGFuY2UsIEJBU0VfUEFUSDogc3RyaW5nLCBjb25maWd1cmF0aW9uPzogQ29uZmlndXJhdGlvbikge1xuICAgIHJldHVybiAoYXhpb3M6IEF4aW9zSW5zdGFuY2UgPSBnbG9iYWxBeGlvcywgYmFzZVBhdGg6IHN0cmluZyA9IEJBU0VfUEFUSCkgPT4ge1xuICAgICAgICBjb25zdCBheGlvc1JlcXVlc3RBcmdzID0gey4uLmF4aW9zQXJncy5vcHRpb25zLCB1cmw6IChjb25maWd1cmF0aW9uPy5iYXNlUGF0aCB8fCBiYXNlUGF0aCkgKyBheGlvc0FyZ3MudXJsfTtcbiAgICAgICAgcmV0dXJuIGF4aW9zLnJlcXVlc3QoYXhpb3NSZXF1ZXN0QXJncyk7XG4gICAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/configuration.d.ts b/dist/configuration.d.ts index eecbdbcc..b7bc4182 100644 --- a/dist/configuration.d.ts +++ b/dist/configuration.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/configuration.js b/dist/configuration.js index 7497452c..a30fbf7f 100644 --- a/dist/configuration.js +++ b/dist/configuration.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -31,7 +31,7 @@ class Configuration { this.baseOptions = {}; if (!this.baseOptions.headers) this.baseOptions.headers = {}; - this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v30.1.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); + this.baseOptions.headers = Object.assign({ ['User-Agent']: `Plaid Node v31.0.0`, ['Plaid-Version']: '2020-09-14' }, this.baseOptions.headers); } /** * Check if the given MIME is a JSON MIME. @@ -49,4 +49,4 @@ class Configuration { } } exports.Configuration = Configuration; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtDQUNyQyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBbUR0QixZQUFZLFFBQWlDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBRXZDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzVDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLG1CQUN0QixDQUFDLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixFQUNwQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFlBQVksSUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQzVCLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLElBQVk7UUFDMUIsTUFBTSxRQUFRLEdBQVcsSUFBSSxNQUFNLENBQUMsK0RBQStELEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUcsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssNkJBQTZCLENBQUMsQ0FBQztJQUMxRyxDQUFDO0NBQ0o7QUFuRkQsc0NBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNjEwLjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblBhcmFtZXRlcnMge1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xufVxuXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmVzIDE2LTI1XG5pbnRlcmZhY2UgUGxhaWRFbnZpcm9ubWVudCB7XG4gIFtlbnY6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFBsYWlkRW52aXJvbm1lbnRzOiBQbGFpZEVudmlyb25tZW50ID0ge1xuICBwcm9kdWN0aW9uOiAnaHR0cHM6Ly9wcm9kdWN0aW9uLnBsYWlkLmNvbScsXG4gIHNhbmRib3g6ICdodHRwczovL3NhbmRib3gucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2MzAuMS4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEI7Ozs7Ozs7Ozs7R0FVRzs7O0FBa0JVLFFBQUEsaUJBQWlCLEdBQXFCO0lBQ2pELFVBQVUsRUFBRSw4QkFBOEI7SUFDMUMsT0FBTyxFQUFFLDJCQUEyQjtDQUNyQyxDQUFDO0FBRUYsTUFBYSxhQUFhO0lBbUR0QixZQUFZLFFBQWlDLEVBQUU7UUFDM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBRXZDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzVDLElBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLG1CQUN0QixDQUFDLFlBQVksQ0FBQyxFQUFFLG9CQUFvQixFQUNwQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLFlBQVksSUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQzVCLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLElBQVk7UUFDMUIsTUFBTSxRQUFRLEdBQVcsSUFBSSxNQUFNLENBQUMsK0RBQStELEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUcsT0FBTyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssNkJBQTZCLENBQUMsQ0FBQztJQUMxRyxDQUFDO0NBQ0o7QUFuRkQsc0NBbUZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNjE3LjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlndXJhdGlvblBhcmFtZXRlcnMge1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBiYXNlT3B0aW9ucz86IGFueTtcbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xufVxuXG4vLyBFZGl0ZWQgYnkgUGxhaWQsIGxpbmVzIDE2LTI1XG5pbnRlcmZhY2UgUGxhaWRFbnZpcm9ubWVudCB7XG4gIFtlbnY6IHN0cmluZ106IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFBsYWlkRW52aXJvbm1lbnRzOiBQbGFpZEVudmlyb25tZW50ID0ge1xuICBwcm9kdWN0aW9uOiAnaHR0cHM6Ly9wcm9kdWN0aW9uLnBsYWlkLmNvbScsXG4gIHNhbmRib3g6ICdodHRwczovL3NhbmRib3gucGxhaWQuY29tJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIGFwaUtleSBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFwaUtleT86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8ICgobmFtZTogc3RyaW5nKSA9PiBzdHJpbmcpIHwgKChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgLyoqXG4gICAgICogcGFyYW1ldGVyIGZvciBiYXNpYyBzZWN1cml0eVxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIHBhcmFtZXRlciBmb3IgYmFzaWMgc2VjdXJpdHlcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBwYXJhbWV0ZXIgZm9yIG9hdXRoMiBzZWN1cml0eVxuICAgICAqIEBwYXJhbSBuYW1lIHNlY3VyaXR5IG5hbWVcbiAgICAgKiBAcGFyYW0gc2NvcGVzIG9hdXRoMiBzY29wZVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4gfCAoKG5hbWU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKSA9PiBzdHJpbmcpIHwgKChuYW1lPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICAvKipcbiAgICAgKiBvdmVycmlkZSBiYXNlIHBhdGhcbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBiYXNlIG9wdGlvbnMgZm9yIGF4aW9zIGNhbGxzXG4gICAgICpcbiAgICAgKiBAdHlwZSB7YW55fVxuICAgICAqIEBtZW1iZXJvZiBDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgYmFzZU9wdGlvbnM/OiBhbnk7XG4gICAgLyoqXG4gICAgICogVGhlIEZvcm1EYXRhIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBtdWx0aXBhcnQgZm9ybSBkYXRhXG4gICAgICogcmVxdWVzdHMuIFlvdSBjYW4gaW5qZWN0IHRoaXMgaGVyZSBzbyB0aGF0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhhdFxuICAgICAqIGRvIG5vdCBzdXBwb3J0IHRoZSBGb3JtRGF0YSBjbGFzcyBjYW4gc3RpbGwgcnVuIHRoZSBnZW5lcmF0ZWQgY2xpZW50LlxuICAgICAqXG4gICAgICogQHR5cGUge25ldyAoKSA9PiBGb3JtRGF0YX1cbiAgICAgKi9cbiAgICBmb3JtRGF0YUN0b3I/OiBuZXcgKCkgPT4gYW55O1xuXG4gICAgY29uc3RydWN0b3IocGFyYW06IENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBwYXJhbS5hcGlLZXk7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSBwYXJhbS51c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhcmFtLnBhc3N3b3JkO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcGFyYW0uYWNjZXNzVG9rZW47XG4gICAgICAgIHRoaXMuYmFzZVBhdGggPSBwYXJhbS5iYXNlUGF0aDtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucyA9IHBhcmFtLmJhc2VPcHRpb25zO1xuICAgICAgICB0aGlzLmZvcm1EYXRhQ3RvciA9IHBhcmFtLmZvcm1EYXRhQ3RvcjtcblxuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucykgdGhpcy5iYXNlT3B0aW9ucyA9IHt9O1xuICAgICAgICBpZighdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzKSB0aGlzLmJhc2VPcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAgIFsnVXNlci1BZ2VudCddOiBgUGxhaWQgTm9kZSB2MzEuMC4wYCxcbiAgICAgICAgICBbJ1BsYWlkLVZlcnNpb24nXTogJzIwMjAtMDktMTQnLFxuICAgICAgICAgIC4uLnRoaXMuYmFzZU9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBnaXZlbiBNSU1FIGlzIGEgSlNPTiBNSU1FLlxuICAgICAqIEpTT04gTUlNRSBleGFtcGxlczpcbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgKiAgIGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGOFxuICAgICAqICAgQVBQTElDQVRJT04vSlNPTlxuICAgICAqICAgYXBwbGljYXRpb24vdm5kLmNvbXBhbnkranNvblxuICAgICAqIEBwYXJhbSBtaW1lIC0gTUlNRSAoTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucylcbiAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGdpdmVuIE1JTUUgaXMgSlNPTiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0pzb25NaW1lKG1pbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBqc29uTWltZTogUmVnRXhwID0gbmV3IFJlZ0V4cCgnXihhcHBsaWNhdGlvblxcL2pzb258W147LyBcXHRdK1xcL1teOy8gXFx0XStbK11qc29uKVsgXFx0XSooOy4qKT8kJywgJ2knKTtcbiAgICAgICAgcmV0dXJuIG1pbWUgIT09IG51bGwgJiYgKGpzb25NaW1lLnRlc3QobWltZSkgfHwgbWltZS50b0xvd2VyQ2FzZSgpID09PSAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 8775db00..6134bd36 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -2,7 +2,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/dist/index.js b/dist/index.js index 9cb832ed..8e6dfc47 100644 --- a/dist/index.js +++ b/dist/index.js @@ -5,7 +5,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). @@ -25,4 +25,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { Object.defineProperty(exports, "__esModule", { value: true }); __exportStar(require("./api"), exports); __exportStar(require("./configuration"), exports); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNjEwLjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQjs7Ozs7Ozs7OztHQVVHOzs7Ozs7Ozs7Ozs7QUFHSCx3Q0FBc0I7QUFDdEIsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vKipcbiAqIFRoZSBQbGFpZCBBUElcbiAqIFRoZSBQbGFpZCBSRVNUIEFQSS4gUGxlYXNlIHNlZSBodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiAyMDIwLTA5LTE0XzEuNjE3LjFcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuXG5cbmV4cG9ydCAqIGZyb20gXCIuL2FwaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvblwiO1xuXG4iXX0= \ No newline at end of file diff --git a/index.ts b/index.ts index ec71b5aa..f7f69cd5 100644 --- a/index.ts +++ b/index.ts @@ -4,7 +4,7 @@ * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * - * The version of the OpenAPI document: 2020-09-14_1.610.1 + * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). diff --git a/package.json b/package.json index a31c6e00..80c5499a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plaid", - "version": "30.1.0", + "version": "31.0.0", "description": "A node.js client for the Plaid API", "keywords": [ "plaid",